2010-10-22 34 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() 
相关问题