Python 不应该进行的正则表达式匹配
Python regex matching when it should not
我有一个字符串列表,我想打印出与正则表达式不匹配的字符串,但我遇到了一些麻烦。正则表达式似乎匹配它不应该匹配的字符串,如果有一个子字符串从匹配正则表达式的字符串的开头开始。我不确定如何解决这个问题。
示例
>>> import re
>>> pattern = re.compile(r'\d+')
>>> string = u"1+*"
>>> bool(pattern.match(string))
True
因为开头的 1
,所以我是对的。我应该如何更改我的正则表达式来解决这个问题?
注意我在 python 2.6.6
让您的正则表达式以 \A
开头并以 \Z
结尾。这将确保匹配从输入字符串的开头开始,并确保匹配在输入字符串的末尾结束。
因此对于您给出的示例,它看起来像:
pattern = re.compile(r'\A\d+\Z')
您应该将 \Z
附加到正则表达式的末尾,因此正则表达式模式为 '\d+\Z'
.
您的代码将变为:
>>> import re
>>> pattern = re.compile(r'\d+\Z')
>>> string = u"1+*"
>>> bool(pattern.match(string))
False
这是可行的,因为 \Z
强制只在字符串的末尾进行匹配。您也可以使用 $
,它强制在字符串末尾之前或 string 末尾的换行符处进行匹配。如果你想强制字符串只包含数值(如果使用 re.match
则无关紧要,但如果使用其他正则表达式库可能有用),你可以在模式的前面添加一个 ^
,在字符串的开头强制匹配。模式将是 '^\d+\Z'
.
我有一个字符串列表,我想打印出与正则表达式不匹配的字符串,但我遇到了一些麻烦。正则表达式似乎匹配它不应该匹配的字符串,如果有一个子字符串从匹配正则表达式的字符串的开头开始。我不确定如何解决这个问题。
示例
>>> import re
>>> pattern = re.compile(r'\d+')
>>> string = u"1+*"
>>> bool(pattern.match(string))
True
因为开头的 1
,所以我是对的。我应该如何更改我的正则表达式来解决这个问题?
注意我在 python 2.6.6
让您的正则表达式以 \A
开头并以 \Z
结尾。这将确保匹配从输入字符串的开头开始,并确保匹配在输入字符串的末尾结束。
因此对于您给出的示例,它看起来像:
pattern = re.compile(r'\A\d+\Z')
您应该将 \Z
附加到正则表达式的末尾,因此正则表达式模式为 '\d+\Z'
.
您的代码将变为:
>>> import re
>>> pattern = re.compile(r'\d+\Z')
>>> string = u"1+*"
>>> bool(pattern.match(string))
False
这是可行的,因为 \Z
强制只在字符串的末尾进行匹配。您也可以使用 $
,它强制在字符串末尾之前或 string 末尾的换行符处进行匹配。如果你想强制字符串只包含数值(如果使用 re.match
则无关紧要,但如果使用其他正则表达式库可能有用),你可以在模式的前面添加一个 ^
,在字符串的开头强制匹配。模式将是 '^\d+\Z'
.