【问题标题】:Python regular expression re.match, why this code does not work? [duplicate]Python正则表达式re.match,为什么这段代码不起作用? [复制]
【发布时间】:2013-02-02 17:37:20
【问题描述】:

这是用 Python 编写的,

import re
s='1 89059809102/30589533 IronMan 30 Santa Ana Massage table / IronMan 30 Santa Ana Massage table'
pattern='\s(\d{11})/(\d{8})'
re.match(pattern,s)

它没有返回。

我试着去掉括号,

pattern='\s\d{11}/\d{8}' 

它仍然返回none

我的问题是:

  1. 为什么 re.match 没有找到任何东西?
  2. 模式中带括号和不带括号有什么区别?

【问题讨论】:

  • @nhahtdh: \s\d 在普通的 python 字符串中没有意义,所以在这种特定情况下没有区别,反斜杠不需要转义。
  • @MartijnPieters:你是对的,但原始字符串对于消除混淆仍然非常有用。不同语言对\ 后跟不形成转义序列的字符的处理方式不同。
  • @nhahtdh:我非常同意;对正则表达式使用r'' 原始字符串当然是一个好主意,也是最佳实践。就在这种情况下,OP很幸运,没有区别。 :-)
  • @nhahtdh:几乎所有使用 \ 单字符转义序列的语言都遵循 ISO C 标准(参见third column on the control codes table),所以一般说你可以假设在任何支持这些转义码的语言中最多有 9 个这样的转义码。事实上,我知道没有一种编程语言支持这样的转义码并且支持超过这 9 个(python 本身支持其中 8 个,\e 不常见)。
  • @nhahtdh: LBNL: 在所有可能混淆的正则表达式锚和字符类中,只有 \b 具有字符转义(退格)和作为正则表达式锚(单词边界的开头)。 :-)

标签: python regex


【解决方案1】:

re.match“匹配”从字符串的开头开始,但多了一个1

改用re.search,它将“搜索”字符串中的任何位置。而且,就您而言,还可以找到一些东西:

>>> re.search(pattern,s).groups()
('89059809102', '30589533')

如果你去掉pattern中的括号,它仍然会返回一个有效的_sre.SRE_Match对象,但是groups是空的:

>>> re.search('\s\d{11}/\d{8}',s).groups()
()

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2014-06-26
    相关资源
    最近更新 更多