2012-03-22 57 views
3

我有一個字符串:Python的正則表達式被動組和回顧後

# print thestring 
abcd\t$500\n 

我想提取的500美元價值不美元符號。

這裏是我的代碼:

# trying positive lookbehind 
m = re.search('(<=\$)\d+$',thestring) 
# trying passive groups 
m = re.search('(?:\$)\d+$',thestring) 

什麼我錯在這裏做什麼?

回答

5

非捕獲組不會從匹配的子字符串中刪除結果,所以這就是爲什麼第二個解決方案不起作用。第一個解決方案應該可以工作,但是你似乎錯誤地使用了正面lookbehind的語法。它應該是:

(?<=\$)\d+$ 
+0

出於好奇,非捕獲組的目的是什麼? – Abdulla 2012-03-22 20:55:14

+2

@Abdulla一個非捕獲組,將內容分組在一起,但不存儲結果。它比捕獲組更快。僅當您需要重用此組的內容時才使用捕獲組。 – stema 2012-03-22 21:06:15

+0

如果您需要以需要分組的方式修改正則表達式,但不想影響現有組的編號,它們也很有用。 – VeeArr 2012-03-23 18:52:50

3

首先,您應該逃避你的反斜線或使用原始字符串:

'(<=\\$)\\d+$' 

r'(<=\$)\d+$' 

下,爲什麼要用回顧後或被動的羣體?你想捕捉這個數字,對吧?如何:

m = re.search('\\$(\\d+)',thestring) 

然後使用m.group(1)檢索您的號碼。

+0

爲什麼要有兩個反斜槓?它似乎與一個罰款。對不起,我對正則表達式很陌生。 – Abdulla 2012-03-22 20:56:31

+1

是的,因爲你很幸運,'\ $'和'\ d'都不是有效的轉義序列。但是如果你輸入了,就說'\ n',你會得到一個換行符,而不是斜槓和'n'。 - 在你的交互式python shell中,評估你的一個非轉義字符串。口譯員會以逃脫的方式返回。 – 2012-03-22 20:58:24

+2

'\ n'實際上並不是一個問題,因爲該轉義序列轉換爲Python換行符就好了。 '\ b'是一個更好的例子 - 作爲正則表達式,它意味着「字邊界」,在一個字符串中,它的意思是「退格」。 – 2012-03-22 21:01:53