为什么这个正则表达式不匹配?

时间:2011-08-21 13:34:53

标签: python regex

我正在使用python,这个正则表达式不匹配,我不明白为什么。

string = "15++12"
if re.match("[-+*/][-+*/]+",string):
    # raise an error here

我正在尝试引发错误,如果“ - ”,“+”,“*”,“/”中的一个或多个跟随另一个错误。

4 个答案:

答案 0 :(得分:6)

使用re.search()作为re.match()仅搜索字符串的开头:

string = "15++12"
if re.search("[-+*/][-+*/]+",string):
    # raise an error here

此外,这可以简化为:

string = "15++12"
if re.search("[-+*/]{2,}",string):
    # raise an error here

,因为{2,}运算符会搜索前一个类中的两个或更多个。

答案 1 :(得分:1)

re.match尝试从字符串的开头匹配。要匹配任何子字符串,请使用re.search或在模式前添加.*

>>> re.match("[-+*/][-+*/]+", s)
>>> re.search("[-+*/][-+*/]+", s)
<_sre.SRE_Match object at 0x7f5639474780>
>>> re.match(".*[-+*/][-+*/]+", '15++12')
<_sre.SRE_Match object at 0x7f5639404c60>

答案 2 :(得分:0)

我相信这是因为re.match只匹配字符串的开头。尝试re.search或re.findall

在python docs上查看7.2.2: http://docs.python.org/library/re.html

答案 3 :(得分:0)

  

Python在这里违反了最低惊喜原则:他们选择了一个   具有确定意义的词,并将其歪曲成意义的东西   与此不同。这不是很邪恶和错误,但确实如此   当然是愚蠢和错误的。 - tchrist @tchrist

我不同意。事实上,我认为恰恰相反,它并不愚蠢

如果我说:

  

正则表达式的模式"\d+[abc]"匹配字符串'145caba'

每个人都会同意这个主张。

如果我说:

  

正则表达式的模式"\d+[abc]"匹配字符串'ref / 789lomono   145abaca ubulutatouti'

80%的人会同意 另外严格的20%的人,我将会对措辞不满意,并会重申将表达改为:

  

"\d+[abc]"匹配字符串'ref / 789lomono中的SOMEWHERE   145abaca ubulutatouti'

这就是为什么我觉得有理由调用一个动作来搜索一个模式在一个字符串中匹配的位置:search()

并调用操作以验证是否从头开始匹配:match()

对我而言,这非常符合逻辑,并不奇怪

PS

我的前一个答案已被删除。因为我不知道怎么写给删除的作者,问他为什么他认为我以前的答案是一个咆哮(!!!?),我重新发布我认为绝对不可能合格的内容