2010-09-09 22 views
46

जब मैं इस अभिव्यक्ति का उपयोग मैं एक त्रुटि संदेश मिलता दोहराने के लिए:regex त्रुटि कुछ भी नहीं

re.sub(r"([^\s\w])(\s*\1)+","\\1","...") 

मैं RegExr पर regex की जाँच की और यह . रिटर्न की उम्मीद के रूप में। लेकिन जब मैं इसे पायथन में आज़माता हूं तो मुझे यह त्रुटि संदेश मिलता है:

raise error, v # invalid expression 
sre_constants.error: nothing to repeat 

क्या कोई कृपया समझा सकता है?

+3

यदि किसी को भी कोई स्पष्ट कारण * के लिए यह त्रुटि नहीं मिलती है, तो सुनिश्चित करें कि आपके वर्चुअलएन्व को बनाते समय पाइथन का संस्करण वैश्विक स्तर पर स्थापित दुभाषिया के संस्करण से मेल खाता है (उदाहरण के लिए, पुरानी vritualenv पाइथन को एक नए संस्करण में अपग्रेड करने से पहले बनाया गया।) – hayavuk

+0

@bvukelic मैं कैसे समायोजित करूं ताकि वे वही हों? –

+0

मैंने अभी मौजूदा एनवी को नष्ट कर दिया, और इसे फिर से बनाया। – hayavuk

उत्तर

32

ऐसा लगता है कि यह एक पाइथन बग (जो पूरी तरह से vim में काम करता है)। समस्या का स्रोत (\ s * ...) + बिट है। असल में, आप (\s*)+ नहीं कर सकते हैं जो समझ में आता है, क्योंकि आप कुछ ऐसा दोहराने की कोशिश कर रहे हैं जो शून्य हो सकता है।

>>> re.compile(r"(\s*)+") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 180, in compile 
    return _compile(pattern, flags) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 233, in _compile 
    raise error, v # invalid expression 
sre_constants.error: nothing to repeat 

हालांकि (\s*\1) शून्य नहीं होना चाहिए, लेकिन हम जानते हैं कि केवल क्योंकि हम जानते हैं \ 1 में क्या है। जाहिर है पाइथन नहीं है ... यह अजीब है।

+0

यहां तक ​​कि वीडर यह है कि '([^ \ s \ w]) (\ 1) +' * करता है * काम करता है। –

+0

@ एलन: हाँ, मैंने यह भी देखा है। – mb14

+0

यदि ऐसा है, तो क्या कोई कामकाज है? – goh

9

यह "*" और विशेष वर्णों के बीच एक पायथन बग है।

के बजाय

re.compile(r"\w*") 

कोशिश

:

re.compile(r"[a-zA-Z0-9]*") 

यह काम करता है, फिर भी एक ही नियमित अभिव्यक्ति नहीं है।

यह बग 2.7.5 और 2.7.6 के बीच तय किया गया प्रतीत होता है।

2

यह वास्तव में केवल एक पायथन बग नहीं है * वास्तव में, यह तब भी हो सकता है जब आप अपनी नियमित अभिव्यक्ति के हिस्से के रूप में एक स्ट्रिंग को संकलित करने के लिए पास करते हैं, जैसे;

import re 
input_line = "string from any input source" 
processed_line= "text to be edited with {}".format(input_line) 
target = "text to be searched" 
re.search(processed_line, target) 

इस करता है, तो कार्रवाई की लाइन निहित एक त्रुटि का कारण होगा कुछ "(+)" उदाहरण के लिए, आप जैसे रासायनिक फार्मूले, या अक्षरों के इस तरह जंजीरों में पा सकते हैं। समाधान से बचने के लिए है, लेकिन जब आप इसे फ्लाई पर करते हैं, तो ऐसा हो सकता है कि आप इसे ठीक से करने में असफल हो जाएं ...

0

खोज और तय की गई बग से परे, मैं बस ध्यान दूंगा कि त्रुटि संदेश sre_constants.error: nothing to repeat थोड़ा उलझन में है। मैं r'?.*' को पैटर्न के रूप में उपयोग करने का प्रयास कर रहा था, और सोचा कि यह * के बारे में कुछ अजीब कारणों के लिए शिकायत कर रहा था, लेकिन समस्या वास्तव में है कि ? "शून्य या एक बार दोहराएं" कहने का एक तरीका है। इसलिए मुझे r'\?.*' को एक शाब्दिक ?

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