2012-06-30 62 views
1

我很確定我錯過了一些非常基本的東西,因爲我通常可以使用Python &正則表達式。我想看看如果提供的字符串中包含至少一個數字,這是在命令行中我經歷,但總是讓假的... ...Python正則表達式搜索永遠是假的?

>>> import re 
>>> test_string = "123567890" 
>>> pat = re.compile("[0-9]") 
>>> pat.search(test_string) == True 
False 

張貼在此之前我已經嘗試了幾個其他的排列,並沒有太多,我做錯了什麼?

回答

4

pat.search不返回布爾值,而是一個MatchObject讓你比較會失敗:

In [9]: p = pat.search(test_string) 

In [10]: p 
Out[10]: <_sre.SRE_Match at 0x3cfa608> 

In [11]: type(p) 
Out[11]: _sre.SRE_Match 

re.search文檔:

re.search(模式,字符串,旗幟= 0)

掃描通過串尋找其中定期 表達模式產生一個匹配的位置處,一個nd返回相應的 MatchObject實例。如果字符串中沒有位置匹配 模式,則返回無;請注意,這與在字符串中的某處找到零長度的 匹配不同。

+0

謝謝,我誤解了文檔,它說:「匹配對象總是布爾值爲True,以便測試例如匹配()是否與簡單的if語句匹配」! – Mike

0

的問題是re.search()方法實際上並不返回bool,它返回一個專門的regexp. match objectbool(pat.search(test_string))應該返回True,即:

>>> import re 
>>> test_string = "123567890" 
>>> pat = re.compile("[0-9]") 
>>> bool(pat.search(test_string)) 
True 

正常的檢查方法有成功的配對是簡單地使用if結構,即:

>>> if pat.search(test_string): True 
... 
True 

您可以使用調查真相的這個縮寫形式測試實現__nonzero____len__特殊方法之一的任何對象。

0

re.search返回MatchObject當它發現匹配,而不是布爾值。當它不匹配時它會返回None,所以這會做你正在做的事情:

pat.search(test_string)!=None 
+2

當與'None'比較時,您應該使用'不是None'(或者'None'作爲倒數) – ThiefMaster

+1

'是None' /'不是None'優於使用比較運算符。因爲'is'可以作爲一個簡單的指針比較來實現,所以它不執行方法查找並且稍微快一些,它在語義上更乾淨,並且防止被覆蓋的__eq__'特殊方法的情況(不可能) ,http://stackoverflow.com/questions/11166748/identity-versus-equality-for-none-in-python/)。 –

0

以下是你應該如何使用匹配對象。我通常需要比匹配對象更多的True/False,所以我總是將它保存起來。

>>> m = pat.search(test_string) 
>>> bool(m) == True 
True 
>>> if m: 
     print "true" 
true