【问题标题】:Checking whole string with a regex使用正则表达式检查整个字符串
【发布时间】:2010-10-22 06:41:16
【问题描述】:

我正在尝试检查字符串是否为数字,因此正则表达式“\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”?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    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 start-of-string 锚点,因为它不会将匹配项锚定在字符串的开头:

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

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

    Python 3

    以上部分中描述的所有这些情况以及一种更有用的方法,re.fullmatch(也存在于PyPi regex module中):

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

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

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

    【讨论】:

    • 您是否需要正则表达式开头的r
    • @Charlie 这不是必需的,但我会使用re.compile(r"\d+")
    【解决方案2】:

    \d+ 匹配您的字符串的任何正数位数,因此它匹配第一个78 并成功。

    使用^\d+$

    或者,更好的是:"78.46.92.168:8000".isdigit()

    【讨论】:

    • \d+$ 应该足够匹配
    • $ 在尾随换行符的情况下不起作用。例如,请参阅re.match(r'^\d+$', '4\n')
    • $^ 是做什么的?
    【解决方案3】:

    \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>
    

    【讨论】:

    • ^$ 是什么意思?
    【解决方案4】:

    re.match() 始终从字符串的开头匹配(与re.search() 不同),但允许匹配在字符串结尾之前结束。

    因此,您需要一个锚点:_rex.match(r"\d+$") 可以工作。

    更明确地说,您也可以使用_rex.match(r"^\d+$")(这是多余的)或完全放弃re.match(),而只使用_rex.search(r"^\d+$")

    【讨论】:

    • $^ 是做什么的?
    • 你需要在正则表达式开头的r吗?
    【解决方案5】:

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

    【讨论】:

    • ^$ 是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 2013-12-04
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多