【问题标题】:Python can't match word at the of of the string(regex module)Python 无法匹配字符串中的单词(正则表达式模块)
【发布时间】:2014-10-05 11:04:24
【问题描述】:

我有以下代码:

p = re.compile(ur'(.{0,20})\b(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}(\d{4,6})\b(.{0,20})', re.IGNORECASE)
test_str = u"223-356-7890 asdasdasdas dfgdfgdf"

print re.match(p, test_str)

它与 223-356-7890 匹配,但当该行是 "asdasdasdas dfgdfgdf 223-356-7890" 时,它不匹配任何东西。有什么问题 ? 我试过 http://regex101.com/ ,它匹配但不在我的 python 中

【问题讨论】:

  • 试试这个(.{0,21})\b(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}(\d{4,6})\b(.{0,20}) 正则表达式。
  • 您到底希望输出是什么?
  • 我希望它只是匹配
  • @JonClements 的意思是,如果您向我们提供您预期的输出,正则表达式可能会变得更简单、更易读。

标签: python regex python-2.6


【解决方案1】:

问题在于,在您的示例中,数字序列前有 21 个字符:

  re.match(ur"(.{0,20})\b(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}\b(.{0,20})",
  "asdasdasdas dfgdfgdf 223-356-7890") 

结果不匹配,但是

  re.match(ur"(.{0,21})\b(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}\b(.{0,20})",
  "asdasdasdas dfgdfgdf 223-356-7890") 

匹配。这是因为您在第一个选项中最多需要 20 个字符,这是无法匹配的。在 regex101:http://regex101.com/r/fN3zU5/27 上,您可以看到对于第二个示例,第一个字符不匹配,导致 python 不匹配。

一个更灵活的解决方案可能是 (.*?)(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}(\d{4,6})(.*)http://regex101.com/r/fN3zU5/28

或者如果你在找到你的数字序列后对剩余的字符串不感兴趣,你可以使用: (.*?)(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}(\d{4,6})(.*?)

点赞:http://regex101.com/r/fN3zU5/29

【讨论】:

    猜你喜欢
    • 2021-05-23
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2023-03-18
    • 2014-07-09
    • 2016-12-06
    • 2016-12-03
    • 1970-01-01
    相关资源
    最近更新 更多