用正则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.MULTILINE
string末尾的换行符,并在re.MULTILINE
performance出不同的行为。 有关详细信息,请参阅语法文档 。
>>> 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
方法一样,需要使用^
/ \A
string开始的锚点,因为它不会在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()