2008-08-17 13 views
11

मैं पाइथन रेगेक्स और बैकरेरेंस के साथ स्ट्रिंग को अनदेखा करने की कोशिश कर रहा हूं, और ऐसा लगता है कि यह बहुत अच्छा काम नहीं करना चाहता है। मुझे यकीन है कि यह कुछ है मैं गलत कर रहा हूँ कर रहा हूँ, लेकिन मैं बाहर क्या समझ नहीं सकता ...स्ट्रिंग को अनदेखा करने के लिए पायथन नियमित अभिव्यक्ति

>>> import re 
>>> mystring = r"This is \n a test \r" 
>>> p = re.compile("\\\\(\\S)") 
>>> p.sub("\\1", mystring) 
'This is n a test r' 
>>> p.sub("\\\\\\1", mystring) 
'This is \\n a test \\r' 
>>> p.sub("\\\\1", mystring) 
'This is \\1 a test \\1' 

मैं बदलने के लिए \\ साथ \ [चार] [चार] चाहते हैं, लेकिन अजगर में backreferences मेरे द्वारा कभी भी उपयोग किए गए हर दूसरे कार्यान्वयन में किए गए नियमों का पालन न करें। क्या कोई कुछ प्रकाश डाल सकता है?

उत्तर

8

है कि क्या ऐन्डर्स नहीं है दूसरा उदाहरण करता है?

2.5 में वहाँ भी एक string-escape है एन्कोडिंग आप आवेदन कर सकते हैं:

>>> mystring = r"This is \n a test \r" 
>>> mystring.decode('string-escape') 
'This is \n a test \r' 
>>> print mystring.decode('string-escape') 
This is 
a test 
>>> 
3

ठीक है, मुझे लगता है कि आप आर चूक या बैकस्लैश miscounted हो सकता है ...

"\\n" == r"\n" 

>>> import re 
>>> mystring = r"This is \\n a test \\r" 
>>> p = re.compile(r"[\\][\\](.)") 
>>> print p.sub(r"\\\1", mystring) 
This is \n a test \r 
>>> 

कौन सा है, अगर मैं समझ गया कि क्या अनुरोध किया गया था है।

मुझे लगता है और अधिक आम अनुरोध यह है:

>>> d = {'n':'\n', 'r':'\r', 'f':'\f'} 
>>> p = re.compile(r"[\\]([nrfv])") 
>>> print p.sub(lambda mo: d[mo.group(1)], mystring) 
This is \ 
a test \ 
>>> 

रुचि छात्र भी पढ़ना चाहिए केन थॉम्पसन के Reflections on Trusting Trust", जिसमें हमारे नायक एक ऐसी ही उदाहरण का उपयोग करता है पर भरोसा compilers के खतरों आप से बूटस्ट्रैप नहीं किया है समझाने के लिए मशीन कोड स्वयं

0

आपको परिणाम स्ट्रिंग के पायथन के प्रतिनिधित्व द्वारा धोखा दिया जा रहा है। अजगर अभिव्यक्ति:

'This is \\n a test \\r' 

स्ट्रिंग

This is \n a test \r 

जो है मुझे लगता है कि तुम क्या चाहते थे प्रतिनिधित्व करता है। स्ट्रिंग के पाइथन प्रतिनिधित्व के बदले वास्तविक स्ट्रिंग को मुद्रित करने के लिए अपने प्रत्येक p.sub() कॉल के सामने 'प्रिंट' जोड़ने का प्रयास करें।

>>> mystring = r"This is \n a test \r" 
>>> mystring 
'This is \\n a test \\r' 
>>> print mystring 
This is \n a test \r 
0

विचार यह है कि मैं एक भाग निकले स्ट्रिंग में पढ़ेंगे, और यह अनएस्केप (एक सुविधा विशेष रूप से अजगर है, जो आप पहली जगह में के लिए नियमित अभिव्यक्ति का सहारा की जरूरत नहीं होनी चाहिए से कमी)। दुर्भाग्य से मैं बैकस्लैश द्वारा धोखा दिया जा रहा है नहीं कर रहा हूँ ...

एक और उदाहरण उदाहरण:

>>> mystring = r"This is \n ridiculous" 
>>> print mystring 
This is \n ridiculous 
>>> p = re.compile(r"\\(\S)") 
>>> print p.sub('bloody', mystring) 
This is bloody ridiculous 
>>> print p.sub(r'\1', mystring) 
This is n ridiculous 
>>> print p.sub(r'\\1', mystring) 
This is \1 ridiculous 
>>> print p.sub(r'\\\1', mystring) 
This is \n ridiculous 

मैं चाहता क्या उसका प्रिंट ले

This is 
ridiculous 
0

मार्क; उनके दूसरे उदाहरण में प्रारंभिक रूप से एक सरणी में फेंकने वाले प्रत्येक भागने वाले चरित्र की आवश्यकता होती है, जो कि एस्केर में उत्पन्न नहीं होता है, यदि एस्केप अनुक्रम सरणी में नहीं होता है। यह किसी भी चीज पर मर जाएगा लेकिन प्रदान किए गए तीन वर्ण (\ v कोशिश करें), और हर बार जब आप स्ट्रिंग को अनचेक करना चाहते हैं (या वैश्विक सरणी रखते हुए) हर संभव बचने के अनुक्रम का आकलन करना वास्तव में एक बुरा समाधान है। PHP के लिए एनालॉग, जो preg_replace_callback() का उपयोग preg_replace() के बजाय लैम्ब्डा के साथ कर रहा है, जो इस स्थिति में पूरी तरह से अनावश्यक है।

मुझे खेद है कि अगर मैं इसके बारे में डिक के रूप में आ रहा हूं, तो मैं सिर्फ पाइथन से निराश हूं।यह मेरे द्वारा कभी भी उपयोग किए जाने वाले हर दूसरे नियमित अभिव्यक्ति इंजन द्वारा समर्थित है, और मुझे समझ में नहीं आता कि यह क्यों काम नहीं करेगा।

जवाब देने के लिए धन्यवाद; string.decode('string-escape') फ़ंक्शन ठीक वही है जो मैं शुरुआत में देख रहा था। अगर किसी के पास रेगेक्स बैकरेफर समस्या का सामान्य समाधान है, तो इसे पोस्ट करने में संकोच न करें और मैं इसे एक उत्तर के रूप में भी स्वीकार करूंगा।

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