मैं 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]
, लेकिन मुझे काम करने के लिए नामित पहुंच आसान लगती है।