2012-10-06 66 views
8

在Python 2.6中。似乎字符串$\Z末尾的標記與組表達式不兼容。佛例如

import re 
re.findall("\w+[\s$]", "green pears") 

回報

['green '] 

(所以$有效不工作)。並使用

re.findall("\w+[\s\Z]", "green pears") 

導致錯誤:

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc in findall(pattern, string, flags) 
    175 
    176  Empty matches are included in the result.""" 
--> 177  return _compile(pattern, flags).findall(string) 
    178 
    179 if sys.hexversion >= 0x02020000: 

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc in _compile(*key) 
    243   p = sre_compile.compile(pattern, flags) 
    244  except error, v: 
--> 245   raise error, v # invalid expression 
    246  if len(_cache) >= _MAXCACHE: 
    247   _cache.clear() 

error: internal: unsupported set operator 

爲什麼它工作的方式以及如何去解決?

+1

'所以$不能有效地work' - 什麼是你期望的輸出? –

+0

@RohitJain'['green','pear']'(從'\ w + \ s''加上'\ w + $'')。 –

回答

22

A [..]表達式是字符組,這意味着它將匹配其中包含的任何一個字符。您因此匹配字面$字符。一個字符組總是適用於一個輸入字符,因此永遠不能包含一個錨點。

如果你想匹配任何一個空白字符字符串的結尾,使用非捕獲組,隨之|或選擇組合:

r"\w+(?:\s|$)" 

或者,看看\b字邊界錨。它會匹配\w組開始或結束的任何位置(因此它將錨定到\w字符前後或後跟\W字符或位於字符串開頭或末尾的文本中的點)。

+0

@EMS:那是因爲我表達式中的':'是一個錯字;糾正。 –

+0

...因爲我的錯字,對不起。 –

+0

我認爲你的意思是**不捕獲**組。這東西已經夠混亂了;讓我們至少嘗試正確地使用術語。 –

3

方括號並不表示一個羣體,他們表示一個字符集,它匹配一個字符作爲documented(這些括號中的任何一個),「特殊字符失去內套它們的特殊含義」(除否則如類似\s那樣表示)。

如果要匹配\s或字符串末尾,請使用類似\s|$之類的內容。

0

Martijn Pieters的回答是正確的。要詳細一點,如果使用捕獲組

r"\w+(\s|$)" 

你:

>>> re.findall("\w+(\s|$)", "green pears") 
[' ', ''] 

這是因爲re.findall()返回拍攝組(\s|$)值。

Parentheses () are used for two purposes:字符組和捕獲的組。要禁用捕獲組,但仍作爲字符組,使用(?:...)語法:

>>> re.findall("\w+(?:\s|$)", "green pears") 
['green ', 'pears'] 
相關問題