用正则表达式检查整个字符串

34 投票
5 回答
46288 浏览
提问于 2025-04-16 05:54

我想检查一个字符串是否是数字,所以我觉得正则表达式 "\d+" 可能不错。不过,这个正则表达式竟然也匹配了 "78.46.92.168:8000",这让我很困惑,因为我并不想要这个结果。这里有一点代码:

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

当输入IP地址时,会调用 doStuff()。我有点搞不懂,为什么 "." 或 ":" 会和 "\d" 匹配呢?

5 个回答

14

re.match() 这个函数总是从字符串的开头开始匹配(和re.search()不一样),但是它可以在字符串的中间就结束匹配,而不是非得到字符串的末尾。

所以,你需要一个锚点:_rex.match(r"\d+$") 这样写就可以了。

如果想更明确一点,你也可以用 _rex.match(r"^\d+$")(虽然这样有点多余),或者干脆不使用 re.match(),直接用 _rex.search(r"^\d+$") 也可以。

24

在Python中,有几种方法可以用正则表达式来匹配整个输入。

Python 2和3

在Python 2和3中,你可以使用

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作为字符串开始的标记,因为它不会在字符串的开头进行匹配:

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

需要注意的是,\A是一个明确的字符串开始标记,它的行为不能通过任何修饰符来改变(re.M / re.MULTILINE只能改变^$的行为)。

Python 3

上面提到的所有情况,以及一个更有用的方法,re.fullmatch(在PyPi regex模块中也有):

如果整个字符串与正则表达式模式匹配,就返回一个相应的匹配对象。如果字符串不匹配模式,则返回None;注意,这与零长度匹配是不同的。

所以,在你编译好正则表达式后,只需使用合适的方法:

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

\d+ 可以匹配你字符串中任何正数位数的数字,所以它会找到第一个 78 并成功匹配。

你可以使用 ^\d+$

或者,更简单的方法是:"78.46.92.168:8000".isdigit()

撰写回答