2011-09-25 93 views
1

我被困在轉儲:這個簡單的正則表達式有什麼問題?

import re 
print re.search('return[^$]+', 
       'return to the Treasury of $40 million\nnow!').group(0) 

上述正則表達式只能打印return to the Treasury of,但我希望它包括$40 million。我從正則表達式理解的是,我要求它到take every thing until the end of the line

我不想使用.*,我想要endline delimiter直到從某點結束。如果我從搜索字符串中刪除$,它會打印完整的字符串。爲什麼與美元符號匹配的endline分隔符?

+1

你真的測試過'return。+'或'return。+ $'爲正則表達式嗎?因爲它聽起來像那些會做你想要的。 –

回答

3
return[^$]+ 

將匹配字符串「迴歸」之後,是不是「$」一次或多次的任何字符。

這是因爲[]意味着字符組和內部[]中的特殊字符作爲簡單字符進行線程化。

因此它只匹配到美元符號。

爲什麼不使用:

return.+$ 

這正是你想要的。

+0

好吧,我明白這一點,我如何告訴正則表達式在'charater class []'中使用'''將它解釋爲'end line delimiter'而不是'dollar character',因爲我們也使用'[^ ​​\ d +]'這裏我們告訴regix去任何數字,爲什麼它不把'd'解釋爲'字母d'呢?如果我使用'[^ ​​\ $] +'正則表達式仍然將'$'解釋爲字符:s –

+0

只有在使用re.MULTILINE時,否則$表示字符串結束。 –

+0

'。+ $'似乎也在工作,但是我已經使用了[[s \ S] + $'這很好,謝謝 –

0

爲什麼你不想使用.*

您擁有的正則表達式將匹配任何以「return」開頭的字符串,然後匹配一個或多個不是「$」字符的字符。請注意,這不會查找行尾標記。

return.*$將匹配一切直至包括行標記的末尾。如果您正在處理多行輸入,您可能(但可能不需要)使.*成爲懶惰匹配器。

+0

我不想使用'。*'因爲我的字符串是多行的,我可以使用'[\ s \ S] +?'但我不知道該停在哪裏。例如如果你在上面的字符串中使用這個正則表達式'return [\ s \ S] +?',它將只打印返回 –

+0

@Aamir - 嘗試沒有'?'。如果使用re.MULTILINE, –

+0

$只會匹配行尾。 –

0
import re 
text = 'we will return to the Treasury of $40 million\nunits of money.' 
re.search(r'return.*$', text, re.MULTILINE).group(0) 

# prints 'we will return to the Treasury of $40 million' 

您需要包含多行標誌,那麼$將在換行符處匹配。

相關問題