【问题标题】:python RE vs html5 REpython RE vs html5 RE
【发布时间】:2012-09-08 02:46:11
【问题描述】:

似乎我在 python 中遇到了一个错误:(Python 2.7.3(默认,2012 年 4 月 10 日,23:24:47)[MSC v.1500 64 位(AMD64)] on win32)

>>> re.match("0[5-7][5-9][0-9]{7}", "0775123456") #match
<_sre.SRE_Match object at 0x0000000002D3FC60>

>>> re.match("0[5-7][5-9][0-9]{7}", "077512345") #dont match

>>> re.match("0[5-7][5-9][0-9]{7}", "07751234567") #match!
<_sre.SRE_Match object at 0x0000000002D3F920>

>>> re.match("0[5-7][5-9][0-9]{7}","07751234567777777777777777777777777777777777777777777777") #match!!
<_sre.SRE_Match object at 0x0000000002D3FC60>

所以我必须使用美元符号来“精确”限制数字! 我认为这是一个错误,因为在 HTML5 验证中,{7} 表示“完全”7 位数字,而在 python 中,它似乎表示“至少” 以下是使用美元符号的行为方式:

>>> re.match("0[5-7][5-9][0-9]{7}$", "0775123456") #match
<_sre.SRE_Match object at 0x0000000002D3F920>

>>> re.match("0[5-7][5-9][0-9]{7}$", "07751234567") #dont match

>>> re.match("0[5-7][5-9][0-9]{7}$", "077512345") #dont match

这发生在所有其他正则表达式中,不仅精确的数字匹配,还必须添加美元!

这是一个错误吗?还是设计使然?

【问题讨论】:

  • 这不是错误。但是,我没有投反对票。
  • @Tadeck 当然,question 不一定是正确的。答案应该。

标签: python regex html


【解决方案1】:

re.match() 的文档指出:

如果字符串的开头有零个或多个字符与正则表达式模式匹配……

(强调我的。)

这意味着匹配完成后字符串中的所有字符都将被忽略。例如,以下内容也可以:

>>> re.match("0[5-7][5-9][0-9]{7}", "0775123456abc")
<_sre.SRE_Match at 0x10ee2e8b8>

正则表达式并没有真正指定匹配必须锚定的位置(如果在任何地方)。例如,Python 也有re.search(),默认情况下也不会在开头锚定。您始终可以使用 ^$ 元字符明确指定锚定。

【讨论】:

  • 谢谢,另外,不知道re.search,再次感谢
【解决方案2】:

这是设计使然。 re.match 匹配字符串的开头,而re.search 匹配字符串中的任何位置。字符串后的额外字符将被忽略。详情请见http://docs.python.org/library/re.html#match

其他也使用正则表达式的语言,例如 grep 和 perl,也有同样的行为。正则表达式主要用于搜索文本。

如果您想执行完全匹配,您必须按照您自己的说明指定美元符号。

【讨论】:

    【解决方案3】:

    正如其他人所说...不是错误,您的正则表达式没有说明为什么 '$' 似乎可以修复它,但这个示例应该:

    import re
    
    print 'food: ',
    print re.match('fo{2}d', 'food')     # match found!
    
    print 'fooood: ',
    print re.match('fo{2}d', 'fooood')   # no match!
    
    {} 之后的

    anything 会给你想要的行为,如果你希望字符串在数字之后结束,那么 $ 是合适的 anything在那里添加。

    【讨论】:

    • -1:OP 已经知道如何解决问题,他在问为什么会发生。您只是在重复问题中已有的内容。
    • @millimoose 我知道他知道$ 修复了它......他说{n} 符号似乎表示n 或更多实例,而这显然不是正在发生的事情.. . 我只是想更清楚地说明这一点。 问题确实与{n}无关,我不确定OP是否意识到这一点。
    • 谢谢你的回答,对不起,我是初学者,现在我得到越来越多的python代码:D
    • @AdamWagner 很公平,我想“这不是一个错误,这是一个可以正常工作的示例”是对“这是一个错误吗?”的有效答案
    • @millimoose 是的……我的并不是一个很好的独立答案……更多的是你和汉斯的补充。我只是想我不需要重复你在回答中的内容。
    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 2014-06-20
    • 2017-10-08
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多