2013-06-19 84 views
-2

我正在使用Python 2.7。正則表達式中的*和。*之間的區別(使用python)

我想知道*.*之間的區別,而匹配的話。

以下是在Python代碼

exp = r'.*c' #here is the expression 
line = '''abc dfdfdc dfdfeoriec''' #the words I need to match 
re.findall(exp,line) #python expression 

從上面的代碼的輸出是:

['abc dfdfdc dfdfeoriec'] 

如果我改變exp值:

exp = r'*c' 

...然後執行時我得到以下錯誤:

Traceback (most recent call last): File "<stdin>", line 1, in 
<module> File "C:\Program 
Files\Enthought\Canopy32\App\appdata\canopy-1.0.0.1160.win-x86\lib\re.py", 
line 177, in findall 
    return _compile(pattern, flags).findall(string) File "C:\Program Files\Enthought\Canopy32\App\appdata\canopy-1.0.0.1160.win-x86\lib\re.py", 
line 242, in _compile 
    raise error, v # invalid expression error: nothing to repeat 

這裏是另一個代碼

exp = r'c.*' 
line1='''cdlfjd ceee cll''' 
re.findall(exp,line1) 

從上面的代碼的輸出是

['cdlfjd ceee cll'] 

如果我的exp值更改爲:

exp = r'c*' 

,然後執行我得到以下輸出。

['c', '', '', '', '', '', '', 'c', '', '', '', '', 'c', '', '', ''] 

請解釋此行爲。

+6

你有沒有擡頭的文件定期Python中的表達式? –

+0

有一些其他的RE問題,這是一個騙局... –

回答

0

這不是一個python的東西,而是一般的正則表達式。 *表示匹配以前的任何數字,當.表示「所有」時,當您做*.c時,表示匹配以char'c'結尾的任意數量的字符。當你做*c這是非法的,因爲*之前沒有表達式。

當你做c*它的意思是「匹配任何數量的連續‘C’的」

我建議你做一些閱讀正則表達式。

2

docs

'*' 

Causes the resulting RE to match 0 or more repetitions of the preceding RE, as many repetitions as are possible. ab* will match ‘a’, ‘ab’, or ‘a’ followed by any number of ‘b’s.

IN r'*c"你沒有前面的字符重複,所以這是一個錯誤。

>>> import re 
>>> strs = "ccceeeddc" 
>>> re.findall(r'c*',strs) 
['ccc', '', '', '', '', '', 'c', ''] 
     | | | | |  | 
     e e e d d  nothing found after last `c` 

c*意味着找到所有'c'秒(0到任意數量的時間)是彼此相鄰,並將它們組合,所以在這裏,當它到達'e'沒有'c'是發現了它返回帶空字符串。

'.*c':將發現的所有內容分組到最後的c

>>> strs = "abccccfoocbar" 
>>> exp = r'.*c' 
>>> re.findall(exp,strs) 
['abccccfooc'] 

>>> strs = "qwertyu" 
>>> re.findall(exp,strs) #no 'c' found 
[] 

'c.*':這是最後一個,組被後第一「c」的fuund所有字符的正好相反。

>>> exp = r'c.*' 
>>> strs = "abccccfoocbar" 
>>> re.findall(exp,strs) 
['ccccfoocbar'] 

>>> strs = "qwertyu" 
>>> re.findall(exp,strs) #no 'c' found 
[] 
+0

感謝您的明確解釋。 –

+0

@BhairavGooli很高興幫助,如果它適合你,你可以[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) 。 –

0

*只是表示它前面的字符可以匹配從0到多次。因此*c不起作用。但c*將匹配cccccc... :) 而.表示匹配任何一個字符。 .*表示匹配任意字符的任何序列。

也許你應該考慮閱讀正則表達式的介紹!

0

*是一個運算符,表示0或更多的左邊匹配。

.是一個運算符意思是匹配任何東西。

c*意味着匹配0或多個C的

.*c將匹配0或更多的東西,然後是C。

1

文檔非常清晰,'*'重複前面的0次或更多次。好像你想忽略指令表達式文檔,並且將它翻譯成你知道的來自其他某個域的內容,比如DOS通配符或shell擴展。

1

在修正表達式中,'x *'匹配0或更多'x'(其中x可以是任何值)的序列。默認情況下,'*'是貪婪的,這意味着它會嘗試匹配儘可能多的字符。
另外,'。'正則表達式中的字符匹配任何字符。

因此,.*表示:匹配長度爲0或更長的包含任何字符的序列。

的你的模式

.*c說明:匹配包含任何字符和後跟字符「C」儘可能長的序列。

*c:匹配包含...的最長可能序列...您沒有指定在序列中允許的內容,引發錯誤。

c.*:匹配字符'c',後跟包含任何字符的最長可能序列。

c*:匹配包含最長可能的序列只有字符'c'。請注意,最長的可能也意味着「長度爲0」(這就是爲什麼你會得到這些空字符串)。


您可能希望找到這對正則表達式的進一步閱讀鏈接有用:

相關問題