Python 正则表达式;为什么搜索和匹配似乎在数字字符串中查找 alpha 字符?

Python regular expression; why do the search & match appear to find alpha chars in a number string?

提问人:Marc B. Hankin 提问时间:3/26/2011 最后编辑:eldarerathisMarc B. Hankin 更新时间:3/26/2011 访问量:203

问:

我在 Windows 总线 64 位环境中的 Python 2.7 中在空闲下方运行搜索。
根据 RegexBuddy 的说法,搜索模式 ('patternalphaonly') 不应生成与数字字符串的匹配。

我看了看“http://docs.python.org/howto/regex.html”,但没有看到任何可以解释为什么搜索和匹配似乎成功地找到了与模式匹配的东西。

有谁知道我做错了什么,或者误解了什么?

>>> import re
>>> numberstring = '3534543234543'
>>> patternalphaonly = re.compile('[a-zA-Z]*')
>>> result = patternalphaonly.search(numberstring)
>>> print result
<_sre.SRE_Match object at 0x02CEAD40>
>>> result = patternalphaonly.match(numberstring)
>>> print result
<_sre.SRE_Match object at 0x02CEAD40>

谢谢

Python 正则表达式

评论


答:

7赞 eldarerathis 3/26/2011 #1

星形运算符 () 表示零次或多次重复。您的字符串与英文字母的重复为零,因为它完全是数字,这在使用星号(重复零次)时是完全有效的。请改用运算符,它表示一个或多个重复。例:*+

>>> n = "3534543234543"
>>> r1 = re.compile("[a-zA-Z]*")
>>> r1.match(n)
<_sre.SRE_Match object at 0x07D85720>
>>> r2 = re.compile("[a-zA-Z]+") #using the + operator to make sure we have at least one letter
>>> r2.match(n)

关于重复运算符的有用链接。

1赞 ridgerunner 3/26/2011 #2

艾尔达雷拉所说的一切都是真的。但是,使用一个名为 的变量: 我假设作者想要验证字符串是否仅由 alpha 字符组成。如果这是真的,那么我会向正则表达式添加额外的字符串末尾锚点,如下所示:'patternalphaonly'

patternalphaonly = re.compile('^[a-zA-Z]+$')
result = patternalphaonly.search(numberstring)

或者,更好的是,由于这只会在字符串的开头匹配,因此请使用首选方法:match

patternalphaonly = re.compile('[a-zA-Z]+$')
result = patternalphaonly.match(numberstring)

(正如约翰·马钦(John Machin)所指出的,由于某种尚未解释的原因,这显然更快。

评论

0赞 Kroltan 1/9/2015
空字符串是否仅由 alpha 字符组成?它可能会,也可能不会,因为它根本没有字符。如果你想让这句话是真的,现在就应该使用。*
1赞 ridgerunner 1/9/2015
@Kroltan - 好点子。OP没有具体说明一种或另一种方式。我的解释是“alphaonly”意味着必须存在 alpha 字符 - 因此,我选择了 + 量词。