2010-10-22 55 views
11

我試圖檢查一個字符串是否是一個數字,所以正則表達式「\ d +」看起來不錯。但是該正則表達式也符合「78.46.92.168:8000」出於某種原因,我不想要的代碼一點點:用正則表達式檢查整個字符串

class Foo(): 
    _rex = re.compile("\d+") 
    def bar(self, string): 
     m = _rex.match(string) 
     if m != None: 
      doStuff() 

而且doStuff()在輸入IP地址時被調用。我有點困惑,怎麼樣「。」或「:」匹配「\ d」?

回答

22

\d+匹配你的字符串中的數字任意正數,因此它匹配的第一個78和成功。

使用^\d+$

,或者甚至更好:"78.46.92.168:8000".isdigit()

+1

+1。如果可以,避免使用正則表達式。 – 2010-10-22 06:56:26

+1

'\ d + $'應該足夠匹配 – Medorator 2014-08-27 17:55:50

+0

'$'在換行符後面不起作用。參見're.match(r'^ \ d + $','4 \ n')'例如。 – Antimony 2015-12-20 20:08:31

10

re.match()總是從字符串(不像re.search())開始匹配,但是允許匹配字符串結束前結束。

因此,您需要一個錨:_rex.match(r"\d+$")將工作。

爲了更加明確,您也可以使用_rex.match(r"^\d+$")(這是多餘的),或者完全刪除re.match(),然後使用_rex.search(r"^\d+$")

7

\Z匹配字符串的末尾,而$匹配字符串的末尾或匹配字符串末尾的換行符,並在re.MULTILINE中顯示不同的行爲。有關詳細信息,請參見the syntax documentation

>>> s="1234\n" 
>>> re.search("^\d+\Z",s) 
>>> s="1234" 
>>> re.search("^\d+\Z",s) 
<_sre.SRE_Match object at 0xb762ed40> 
2

Python中有幾個選項可以將整個輸入與正則表達式匹配。

的Python 2

在Python 2.x中,你可以使用

re.match(r'\d+$') # re.match anchors the match at the start of the string, so $ is what remains to add 

或 - 避免在字符串中的最後\n之前匹配:

re.match(r'\d+\Z') # \Z will only match at the very end of the string 

或相同以上re.search方法需要使用^/\A開始字符串錨點,因爲它不錨定matc在字符串的開頭H:

re.search(r'^\d+$') 
re.search(r'\A\d+\Z') 

注意\A是一個明確的字符串開始錨,其行爲不能與任何改性劑(re.M/re.MULTILINE僅可以重新定義^$行爲)重新定義。

Python 3中

所有在Python 2部分中所描述的那些情況下和一個更有用的方法,re.fullmatch(也存在於PyPi regex module):

如果整個正則表達式匹配模式,返回一個相應的匹配對象。如果字符串不匹配模式,則返回None;請注意,這與零長度匹配不同。

所以,編譯正則表達式後,只需使用適當的方法:

_rex = re.compile("\d+") 
if _rex.fullmatch(s): 
    doStuff()