2015-07-13 6 views
6

यहाँ से "दोहराने के लिए कुछ भी नहीं है" एक regex है - egrep द्वारा और उसके बाद अजगर 2.7 करने की कोशिश की:अजगर regex

$ गूंज '/some/path/to/file/abcde.csv' | egrep '* ([a-zA-Z] +) सीएसवी।'

/कुछ/path/to/फ़ाइल/

हालांकि abcde.csv, पायथन में एक ही regex:

re.match(r'*([a-zA-Z]+)\.csv',f) 

देता है:

+०१२३५१६४१०:

Traceback (most recent call last): 
    File "/shared/OpenChai/bin/plothost.py", line 26, in <module> 
    hosts = [re.match(r'*([a-zA-Z]+)\.csv',f).group(1) for f in infiles] 
    File "/usr/lib/python2.7/re.py", line 141, in match 
    return _compile(pattern, flags).match(string) 
    File "/usr/lib/python2.7/re.py", line 251, in _compile 
    raise error, v # invalid expression 
sre_constants.error: nothing to repeat 

एक खोज से पता चलता कर क्या यहां खेलने में एक अजगर बग प्रतीत होता है

regex error - nothing to repeat

यह एक अजगर बग (कि vim में पूरी तरह से काम करता है) हो रहा है। समस्या का स्रोत है (\ s * ...) + बिट।

हालांकि, यह मेरे लिए स्पष्ट नहीं है: - अजगर खुश करने के लिए क्या तो ऊपर दिखाए गए मेरी regex के लिए समाधान नहीं है?

धन्यवाद।

+2

क्या आपने '। *' या '। *?' की कोशिश की है? –

+0

यह एक अजगर बग नहीं है; आपके पास पिछले चरित्र के बिना '*' (जिसका अर्थ है 'पिछला वर्ण दोहराया गया 0 या अधिक बार')। –

+0

'*' रेगेक्स में 'पिछले या अधिक 'का अर्थ है, तो आप जो शिकायत कर रहे हैं वह एक बग नहीं है। आप क्या चाहते हैं कि '*' मिलान हो? –

उत्तर

3

आपको पैटर्न में * की आवश्यकता नहीं है, यह समस्या का कारण बनता है।

उपयोग

([a-zA-Z]+)\.csv 

या पूरी स्ट्रिंग मिलान करने के लिए:

.*([a-zA-Z]+)\.csv 

देखें demo

कारण है कि * नहीं छोड़ा जाएगा है और इस तरह एक परिमाणक माना जाता है। यह रेगेक्स में पिछले उप-पैटर्न पर लागू होता है। यहां, इसका उपयोग पैटर्न की शुरुआत में किया जाता है, और इस प्रकार कुछ भी प्रमाणित नहीं किया जा सकता है। इस प्रकार, दोहराने के लिए कुछ भी नहीं फेंक दिया गया है।

यदि यह "काम" विम में, यह सिर्फ इसलिए कि विम regex इंजन इस subpattern पर ध्यान नहीं देता (समान रूप जावा [([)]] की तरह एक चरित्र वर्ग के भीतर नहीं छोड़ा जाएगा [ और ] के साथ करता है) है।

+0

मैं देखता हूं। तो फिर egrep क्यों काम करता है? – javadba

+0

इसे बस अनदेखा किया जाता है। पाइथन इसे अनदेखा नहीं कर सकता है क्योंकि शायद यह एक मानवीय त्रुटि है। –

3

यह एक बग पायथन रेगेक्स इंजन मिलान पैटर्न के लिए पारंपरिक एनएफए का उपयोग नहीं करता है। और चरित्र * टोकन से पहले होने पर बस काम करता है।

'*'

का कारण बनता है, जिसके परिणामस्वरूप आरई आरई, के रूप में कई repetitions के पूर्ववर्ती 0 या अधिक repetitions के मैच के लिए के रूप में संभव हो रहे हैं। अब * किसी 'बी' के बाद 'ए', 'एबी', या 'ए' से मेल खाएगा।

r'.*([a-zA-Z]+)\.csv' 

इसके अलावा मॉड्यूल fnmatch जो यूनिक्स शेल शैली वाइल्डकार्ड का समर्थन प्रदान करते हैं अजगर:

बजाय आप .* जो किसी भी चरित्र (.) दोहराने का उपयोग कर सकते हैं।

>>> import fnmatch 
>>> s="/some/path/to/file/abcde.csv" 
>>> fnmatch.fnmatch(s, '*.csv') 
True 
संबंधित मुद्दे