/ / टुपल्स को पार्स करने के लिए कैसे जिसमें कोई सीमांकक नहीं है? - अजगर, अजगर 3.x, पार्सिंग, पीपरसिंग

Tuples का विश्लेषण कैसे करें जिसमें कोई delimiters नहीं है? - अजगर, अजगर-3.x, पार्सिंग, पाइपर्सिंग

मैं pyparser का उपयोग कर रहा हूं और उन फ़ाइलों को पार्स करना चाहता हूं जिनमें समान संरचना वाले मानों के साथ ट्री संरचना सम्‍मिलित है, जो बिना किसी वास्तविक सीमांकक के बराबर है।

मैंने दुर्लभ को छोड़कर सभी पार्सिंग को इतनी अच्छी तरह से किया हैऐसे मामले जब डेटा कई लाइनों में जमा हो जाता है, तो मुझे पार्सर को फिर से लिखना नहीं पड़ता है क्योंकि मूल्य को बराबरी से रोकना नहीं है क्योंकि बराबरी पर हस्ताक्षर लाइन के अंत तक होते हैं, लेकिन बराबरी के चिन्ह से दूसरी बराबरी पर हस्ताक्षर (या end) उस शब्द को अनदेखा करना जो इसे आगे बढ़ाता है (या अनदेखा करता है end)।

डेटा का उदाहरण:

(
ItemName = foo
SomeOtherStuff = bar
foo1
foo2
AString1 = ItemName
SomeOtherStuff
)

कोड:

equals = Suppress("=")
token = Word(alphanums + "-,./_:*+=#[];")
decimal = Regex(r"-?0|[1-9]d*").setParseAction(lambda t:int(t[0]))
stringTemplate = token | decimal
sexpList = Group(Suppress("(") + ZeroOrMore(sexp) + Suppress(")"))
sexp = Forward()

यह स्पष्ट रूप से काम नहीं करता है

astring = समूह (stringTemplate + बराबर + stringTemplate)

तो मैंने "ये कोशिश की:"

multilineString = Group(token + equals + OneOrMore(stringTemplate) + ~FollowedBy(stringTemplate + equals))
multilineString = Group(token + equals + OneOrMore(stringTemplate) + NotAny(stringTemplate + equals))
multilineString = Group(token + equals + OneOrMore(stringTemplate) + ~(stringTemplate + equals))

लेकिन यह काम नहीं किया। मुझे जो मिला वह या तो त्रुटि थी या एक रिकॉर्ड के रूप में सभी डेटा को पार्स करने वाला।

उत्तर:

उत्तर № 1 के लिए 1

आप सही रास्ते पर हैं ~FollowedBy, लेकिन इन भावों का हिस्सा होना चाहिए OneOrMore दोहरावदार अभिव्यक्ति। कुछ इस तरह:

multilineString = Group(token + equals + OneOrMore(stringTemplate + ~FollowedBy(equals)))
for match in multilineString.searchString(test):
match.pprint()

कुछ अन्य टिप्पणियाँ:

  • की परिभाषाओं को देखें token, decimal, तथा stringTemplate। जैसा कि यह अब खड़ा है, आप कभी मेल नहीं करेंगे decimal अभिव्यक्ति। गलती से बचने के लिए ए integer के लिए token, मैं आपको बदलने का सुझाव देता हूं token सेवा मेरे Word(alphas, alphanums + "-,./_:*+=#[];")
  • आप पुनर्विचार करना चाह सकते हैं कि क्या आप "=" के भाग के रूप में अनुमति देना चाहते हैं token। अगर किसी के बीच की जगह को छोड़ दिया जाए token और परिसीमन "=", क्या मतलब था कि एक परिसीमन में चूसा जाएगा token चाबी।
  • प्रत्येक कुंजी-मूल्य जोड़ी की कुंजी और मान बिट्स तक पहुँचने में मदद करने के लिए परिणाम नाम जोड़ने पर विचार करें: multilineString = Group(token("key") + equals + OneOrMore(stringTemplate + ~FollowedBy(equals))("value"))। फिर आप उन्हें पसंद कर सकते हैं match.key तथा match.value - बेशक आप कुंजी के रूप में सूची अनुक्रमण का उपयोग कर सकते हैं match[0], लेकिन मुझे काम करने के लिए नामित पहुंच आसान लगती है।