2010-01-26 15 views
7

मैं ply का उपयोग कर एक पार्सर लिख रहा हूं जिसे FORTRAN स्ट्रिंग अक्षर की पहचान करने की आवश्यकता है। इन्हें सिंगल कोट्स के साथ उद्धृत किया गया है जिसमें भागने वाले चरित्र को सिंगल कोट्स दोगुना किया जा रहा है। अर्थातएक स्ट्रिंग अक्षर से मेल खाने के लिए नियमित अभिव्यक्ति कैसे लिखें जहां से बच निकलने वाले चरित्र का दोगुना हो?

'I don''t understand what you mean'

एक वैध FORTRAN स्ट्रिंग बच गए है।

प्ली नियमित अभिव्यक्ति में इनपुट लेता है। मेरा प्रयास अभी तक काम नहीं करता है और मुझे समझ में नहीं आता क्यों।

t_STRING_LITERAL = r"'[^('')]*'"

कोई भी विचार?

उत्तर

20

एक स्ट्रिंग शाब्दिक है:

  1. एक खुला एकल बोली, जिसके बाद:
  2. दोगुनी-एकल उद्धरण और गैर एकल उद्धरण की कोई भी संख्या, तो
  3. एक करीबी एकल उद्धरण ।

इस प्रकार, हमारे regex है:

r"'(''|[^'])*'" 
+1

आह नियमित अभिव्यक्ति की ज़ेन, धन्यवाद! – Brendan

+1

यह भागने के दृश्यों को संभालने के लिए प्रतीत नहीं होता है। – Cyoce

4

आप कुछ इस तरह हैं:

r"'([^']|'')*'" 

यह कहते हैं कि आप या तो दोहरे उद्धरण चिह्नों या गैर हो सकता है एकल उद्धरण के अंदर है कि उद्धरण चरित्र।

ब्रैकेट एक वर्ण वर्ग को परिभाषित करते हैं, जिसमें आप उन पात्रों को सूचीबद्ध करते हैं जो मेल खाते हैं या नहीं। यह उससे कहीं अधिक जटिल की अनुमति नहीं देता है, इसलिए ब्रांड्स का उपयोग करने और एकाधिक-वर्ण अनुक्रम से मिलान करने का प्रयास ('') काम नहीं करता है। इसके बजाय आपकी [^('')] वर्ण वर्ग [^'()] के समतुल्य है, यानी यह किसी भी उद्धरण या बाएं या दाएं कोष्ठक नहीं है।

0

यह कुछ विशेष स्ट्रिंग शाब्दिक है कि आप समस्याओं को दे रहे हैं पार्स करने के लिए त्वरित और गंदे पाने के लिए आम तौर पर आसान है, लेकिन एक सामान्य समाधान के लिए आप pyparsing module से स्ट्रिंग शाब्दिक के लिए एक बहुत शक्तिशाली और पूर्ण regex प्राप्त कर सकते हैं:

>>> import pyparsing 
>>> pyparsing.quotedString.reString 
'(?:"(?:[^"\\n\\r\\\\]|(?:"")|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*")|(?:\'(?:[^\'\\n\\r\\\\]|(?:\'\')|(?:\\\\x[0-9a-fA-F]+)|(?:\\\\.))*\')' 

मुझे फ़ोरट्रान के स्ट्रिंग अक्षर और पायथन के बीच महत्वपूर्ण मतभेदों के बारे में निश्चित नहीं है, लेकिन अगर यह कुछ और नहीं है तो यह एक आसान संदर्भ है।

0
import re 

ch ="'I don''t understand what you mean' and you' ?" 

print re.search("'.*?'",ch).group() 
print re.search("'.*?(?<!')'(?!')",ch).group() 

परिणाम

'I don' 
'I don''t understand what you mean'