मैं pyparsing का उपयोग कर बैकस्लैश-न्यूलाइन संयोजन ("\\n
") के साथ कई पंक्तियों पर टूटने वाले शब्दों को पार्स करने का प्रयास कर रहा हूं। यहाँ मैं क्या किया है है:एकाधिक पंक्तियों पर एक शब्द से बचने के लिए पाइपर्सिंग का उपयोग करना
from pyparsing import *
continued_ending = Literal('\\') + lineEnd
word = Word(alphas)
split_word = word + Suppress(continued_ending)
multi_line_word = Forward()
multi_line_word << (word | (split_word + multi_line_word))
print multi_line_word.parseString(
'''super\\
cali\\
fragi\\
listic''')
उत्पादन मैं ['super']
है, जबकि उम्मीद उत्पादन ['super', 'cali', fragi', 'listic']
है। अभी भी बेहतर है उन सभी को एक शब्द के रूप में शामिल हो गए हैं (जो मुझे लगता है कि मैं सिर्फ multi_line_word.parseAction(lambda t: ''.join(t))
साथ क्या कर सकते हो जाएगा।
मैं pyparsing helper में इस कोड को देख कोशिश की, लेकिन यह मुझे एक त्रुटि देता है, maximum recursion depth exceeded
।
संपादित करें 2009-11-15: मुझे बाद में एहसास हुआ कि सफेद अंतरिक्ष के संबंध में पाइपर्सिंग थोड़ा उदार हो जाता है, और इससे कुछ खराब धारणाएं होती हैं जो मैंने सोचा था कि मैं पार्सिंग कर रहा था, बहुत कम था। यही कहना है, हम चाहते हैं शब्द, भागने, और ईओएल चरित्र के किसी भी भाग के बीच कोई सफेद स्थान नहीं देखें।
मुझे एहसास हुआ कि उपरोक्त छोटी उदाहरण स्ट्रिंग एक परीक्षण मामले के रूप में अपर्याप्त है, इसलिए मैंने निम्नलिखित यूनिट परीक्षण लिखे हैं। कोड जो इन परीक्षणों को पास करता है, वह मुझे बचने में सक्षम होना चाहिए जो मैं सहजता से बचने के लिए — और केवल एक भागने-विभाजित शब्द के रूप में सोचने में सक्षम होना चाहिए। वे एक ऐसे मूल शब्द से मेल नहीं खाएंगे जो बचने वाला नहीं है। हम — कर सकते हैं और मेरा मानना है कि — उस के लिए एक अलग व्याकरणिक निर्माण का उपयोग करना चाहिए। यह दो अलग होने के साथ यह सब साफ रखता है।
import unittest
import pyparsing
# Assumes you named your module 'multiline.py'
import multiline
class MultiLineTests(unittest.TestCase):
def test_continued_ending(self):
case = '\\\n'
expected = ['\\', '\n']
result = multiline.continued_ending.parseString(case).asList()
self.assertEqual(result, expected)
def test_continued_ending_space_between_parse_error(self):
case = '\\ \n'
self.assertRaises(
pyparsing.ParseException,
multiline.continued_ending.parseString,
case
)
def test_split_word(self):
cases = ('shiny\\', 'shiny\\\n', ' shiny\\')
expected = ['shiny']
for case in cases:
result = multiline.split_word.parseString(case).asList()
self.assertEqual(result, expected)
def test_split_word_no_escape_parse_error(self):
case = 'shiny'
self.assertRaises(
pyparsing.ParseException,
multiline.split_word.parseString,
case
)
def test_split_word_space_parse_error(self):
cases = ('shiny \\', 'shiny\r\\', 'shiny\t\\', 'shiny\\ ')
for case in cases:
self.assertRaises(
pyparsing.ParseException,
multiline.split_word.parseString,
case
)
def test_multi_line_word(self):
cases = (
'shiny\\',
'shi\\\nny',
'sh\\\ni\\\nny\\\n',
' shi\\\nny\\',
'shi\\\nny '
'shi\\\nny captain'
)
expected = ['shiny']
for case in cases:
result = multiline.multi_line_word.parseString(case).asList()
self.assertEqual(result, expected)
def test_multi_line_word_spaces_parse_error(self):
cases = (
'shi \\\nny',
'shi\\ \nny',
'sh\\\n iny',
'shi\\\n\tny',
)
for case in cases:
self.assertRaises(
pyparsing.ParseException,
multiline.multi_line_word.parseString,
case
)
if __name__ == '__main__':
unittest.main()
'संयोजन' का उपयोग करने से कोई हस्तक्षेप करने वाली व्हाइटस्पेस भी लागू नहीं होती है। – PaulMcG
दिलचस्प। कोशिश की 'multi_line_word = संयोजन (संयोजन (OneOrMore (split_word)) + वैकल्पिक (शब्द))' लेकिन यह 'sh \\\ n iny' मामले पर टूट जाता है जिसमें यह अपवाद नहीं उठाता है, बल्कि इसके बजाय वापस '[' sh '] '। क्या मैं कुछ भूल रहा हूँ? – gotgenes
ठीक है, आपका शब्द सिर्फ '\' - न्यूलाइन में फैले अक्षरों में नहीं है, लेकिन वहां 'i' अक्षर से पहले उस स्थान पर है, जो शब्द ब्रेक के रूप में गिना जाता है, इसलिए 'sh' के बाद संयोजन बंद हो जाता है। आप * एक आसन्न = झूठी कन्स्ट्रक्टर तर्क के साथ संयोजन को संशोधित कर सकते हैं, लेकिन सावधान रहें - आप पूरी फ़ाइल को एक शब्द के रूप में चूसने लग सकते हैं! या यदि आप किसी भी अग्रणी रिक्त स्थान को भी पतन करना चाहते हैं, तो आप लाइन के बाद किसी भी व्हाइटस्पेस को शामिल करने के लिए निरंतर_करण की अपनी परिभाषा को फिर से परिभाषित कर सकते हैं। – PaulMcG