用正则expression式检查整个string

我试图检查一个string是否是一个数字,所以正则expression式“\ d +”看起来不错。 然而,这个正则expression式也适合“78.46.92.168:8000”由于某种原因,我不想要一点代码:

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

而当inputIP地址时,doStuff()会被调用。 我有点困惑,“怎么样”。 或“:”匹配“\ d”?

\d+匹配string中任何正数的数字,所以它匹配前78并成功。

使用^\d+$

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

re.match()总是匹配从string的开始(不像re.search() ),但允许匹配在string结束之前结束。

因此,你需要一个锚: _rex.match(r"\d+$")将工作。

为了更加明确,你也可以使用_rex.match(r"^\d+$") (这是多余的),或者直接使用re.match()并使用_rex.search(r"^\d+$")

\Z匹配string的末尾,而$匹配string的末尾或re.MULTILINEstring末尾的换行符,并在re.MULTILINEperformance出不同的行为。 有关详细信息,请参阅语法文档 。

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

将其从\d+更改为^\d+$

Python中有几个选项将整个input与正则expression式匹配。

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 

或者 – 避免在string的最后\n之前进行匹配:

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

或者与上面的re.search方法一样,需要使用^ / \Astring开始的锚点,因为它不会在string开头定位匹配:

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

请注意\A是一个明确的string开始锚点,其行为不能用任何修饰符重新定义( re.M / re.MULTILINE只能重新定义^$行为)。

Python 3

在Python 2部分描述的所有情况以及一个更有用的方法re.fullmatch (也存在于PyPi regex模块中 ):

如果整个string与正则expression式模式匹配,则返回相应的匹配对象。 如果string与模式不匹配则返回None ; 请注意,这与零长度匹配不同。

所以,编译正则expression式之后,只需使用适当的方法:

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