【问题标题】:How to match an underscore using Python's regex? [duplicate]如何使用 Python 的正则表达式匹配下划线? [复制]
【发布时间】:2016-09-24 16:09:33
【问题描述】:

我在使用正则表达式匹配 Python 中的下划线字符时遇到问题。只是在 shell 中玩耍,我得到:

>>> import re
>>> re.match(r'a', 'abc')
<_sre.SRE_Match object at 0xb746a368>
>>> re.match(r'_', 'ab_c')
>>> re.match(r'[_]', 'ab_c')
>>> re.match(r'\_', 'ab_c')

我预计其中至少有一个会返回匹配对象。我做错了吗?

【问题讨论】:

  • re.match 如果它在字符串的开头,则返回匹配。使用re.search
  • 谢谢,我没有意识到这一点。
  • re.match(r'.*\_.*', string) ?

标签: python regex


【解决方案1】:

如果您要查找的模式不在搜索字符串的开头,请使用 re.search 而不是 re.match。

re.match(pattern, string, flags=0)

尝试在字符串的开头应用模式,返回匹配 对象,如果没有找到匹配项,则为 None。

re.search(pattern, string, flags=0)

扫描字符串寻找匹配的模式,返回一个 匹配对象,如果没有找到匹配项,则为 None。

您无需转义_,甚至无需使用原始字符串。

>>> re.search('_', 'ab_c')
Out[4]: <_sre.SRE_Match object; span=(2, 3), match='_'>

【讨论】:

    【解决方案2】:

    尝试以下方法:

    re.search(r'\_', 'ab_c')
    

    您确实是正确地避开了下划线字符! 请注意,您只能将 match 用于字符串的开头,这在文档 (https://docs.python.org/2/library/re.html) 中也很清楚:

    如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的 MatchObject 实例。如果字符串与模式不匹配,则返回 None;请注意,这与零长度匹配不同。

    在这种情况下你应该使用search:

    扫描字符串,寻找正则表达式模式产生匹配的第一个位置,并返回相应的 MatchObject 实例。如果字符串中没有位置与模式匹配,则返回 None;请注意,这与在字符串中的某个点找到零长度匹配不同。

    【讨论】:

    • 这里的问题不是转义下划线:而是 OP 正在使用 match 而他们想要 search
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多