2012-11-13 11 views
5

मैं लाइटिक्स फ़ाइल में टिप्पणियों को हटाने के लिए एक पायथन रेगेक्सपी का उपयोग करना चाहता हूं। लाटेक्स में एक टिप्पणी "%" से शुरू होती है। लेकिन अगर% वर्ण बच निकला है ("\%") तो यह कोई टिप्पणी नहीं है, इसका प्रतीक प्रतिशत है।एक पायथन regexp के एक चरित्र सेट में बैकस्लैश ('बैकस्लैश नहीं' चरित्र सेट निर्दिष्ट करने के लिए कैसे?

यह कार्य मेरे लाटेक्स टेक्स्ट पर लागू होने वाले कई regexp में से एक है। मैं इन सभी reg exp को dicts की सूची में स्टोर करता हूं।

मुझे जिस समस्या का सामना करना पड़ता है वह यह है कि टिप्पणियों को छंटनी के लिए मैं उपयोग करता हूं regexp काम नहीं करता है (क्योंकि मुझे नहीं पता कि चरित्र सेट 'बैकस्लैश नहीं' कैसे निर्दिष्ट करें)। चरित्र सेट में बैकस्लैश समापन ']' से बच निकलता है और regexp गलत है।

मेरे कोड:

regexps=[] 
regexps.append({r'left':'%.*', 'right':r''}) # this strips all the comments, but messes up with the percent characters (\%) 
regexps.append({r'left':'[^\]%.*', 'right':r''}) # this is incorrect (escapes the closing "]") 
return applyRegexps(latexText, regexps) 


def applyRegexps(text, listRegExp): 
    """ Applies successively many regexps to a text""" 
    if testMode: 
     print str(listRegExp) 
    # apply all the regexps in the list 
    for element in listRegExp: 
     left = element['left'] 
     right = element['right'] 
     r=re.compile(left) 
     text=r.sub(right,text) 
    return text 

किसी भी मदद की बहुत सराहना की जाएगी। धन्यवाद!

गाइल्स

+0

क्या आपने 'r '[^ \\]'' का उपयोग करने का प्रयास किया था? बैकस्लैश – Bakuriu

+0

से बचने के लिए '\\' को रेगेक्स सिंटैक्स होना चाहिए यदि आप एक शाब्दिक बैकस्लैश को रेगेक्स में रखना चाहते हैं, तो इसे डबल करें। आपके पटर को '[^ \\]%। *' –

+0

धन्यवाद दोस्तों को पढ़ना चाहिए, मार्टिजन पीटर काम का जवाब देते हैं। मुझे थक जाना चाहिए ... – user1821466

उत्तर

5

सीधे शब्दों में बैकस्लैश दोगुना है, लेकिन एक कच्चे स्ट्रिंग शाब्दिक का उपयोग उन्हें दोगुना करने के लिए फिर होने से बचाने के कार्य करें:

regexps.append({'left':r'[^\\]%.*', 'right':r''}) 
+1

'बाएं' के लिए कच्ची स्ट्रिंग असफल है ... – l4mpi

+0

@ l4mpi: वास्तव में, लेकिन ओपी के पास भी कुंजी के लिए कच्ची स्ट्रिंग थी .. –

1

हालांकि मार्टिन पीटर्स का जवाब एक आप के लिए कहा है, मैं मुझे यकीन नहीं है कि यह वही है जो आप वास्तव में खोज रहे हैं। उदाहरण के लिए यह पैटर्न स्ट्रिंग के पहले अक्षर के रूप में % से मेल नहीं खाएगा (क्योंकि इसके सामने कोई गैर-बैकस्लैश वर्ण नहीं है)। (सहित

  • [^\\]% एक % एक गैर बैकस्लैश चरित्र से पहले मेल खाता है:

    r'(?<!\\)%.*' 
    

    अंतर यह है: क्या आप वास्तव में चाहते हैं शायद एक नकारात्मक अग्रदर्शी (आप अभी भी बैकस्लैश से बचने के लिए की जरूरत है) है मैच में उस चरित्र)

  • (?<!\\)% से मेल खाता है एक % कि एक बैकस्लैश चरित्र से पहले नहीं किया गया है (मैच में यह शामिल किए बिना)
0,123,

बाद वाला एक स्ट्रिंग की शुरुआत में % के लिए भी सच है।

संबंधित मुद्दे