【问题标题】:Why this regular expression pattern matches even an extra character in string?为什么这个正则表达式模式甚至匹配字符串中的额外字符?
【发布时间】:2014-05-25 14:09:44
【问题描述】:

学习正则表达式越来越难了,看下面的python正则表达式代码sn-p。

>>> import re
>>> str = "demo"
>>> re.search("d?mo",str)
<_sre.SRE_Match object at 0x00B65330>

在上面的例子中,为什么它返回了匹配的对象,甚至不是?

我知道,符号“?”表示它将匹配前面字符的 0 次或 1 次重复,但是

从上面的例子中,

1.'d' is matched with 'd'
2.'m' is matched with 'm'
3.'o' is matched with 'o'

但是与哪个字符'e'匹配?根据我的理解,只有 'dmo' 或 'mo' 必须与给定的模式匹配,但为什么是 'demo'。

如果我只想匹配“dmo”或“mo”,正确的模式是什么?

【问题讨论】:

  • 不要命名变量str,因为你会屏蔽内置的str function

标签: python regex


【解决方案1】:

对于正则表达式Rre.search('R', str) 实际上与re.match('.*R', str) 相同。

所以你有(实际上......忽略换行符)

re.match(".*d?mo", "demo")

.* 匹配 "de"d? 匹配 ""mo 匹配 "mo"


您可以使用捕获组进行检查:

re.search("(d?mo)", "demo").group(0)
#>>> 'mo'

d? 不匹配,因为它是可选的。

【讨论】:

    【解决方案2】:

    那是因为您正在使用re.search 而不是re.match。如果你想匹配整个字符串,你必须这样做:

    re.match("d?mo$",str)
    

    或者,您也可以这样做:

    re.search("^d?mo$",str)
    

    达到类似的效果

    【讨论】:

    • 能否告诉我匹配和搜索方法的区别?
    • @RajeshKumar, match 只从字符串的开头搜索。
    • 与哪个字符'e'匹配?
    • @RajeshKumar,无。使用search,正则表达式匹配0 d,后跟mo,因此它仅匹配'mo'。因为它是search 而不是match,所以它匹配,因为search 不需要从字符串的开头匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多