【问题标题】:find a word in a sentence using regular expression使用正则表达式在句子中查找单词
【发布时间】:2013-11-08 18:21:10
【问题描述】:

所以,我试图在一个句子中找到一个单词(一个完整的单词)。假设这句话是

Str1 = "1. how are you doing"

我有兴趣找到如果

Str2 = "1."

在里面。如果我这样做,

re.search(r"%s\b" % Str2, Str1, re.IGNORECASE)

应该说找到了匹配项,不是吗?但 re.search 对此查询失败。为什么?

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    这里有两个问题:

    1. \b 匹配单词和非单词字符之间的位置,因此在任何字母、数字或下划线以及不匹配该集合的字符之间。

      您正在尝试匹配. 和空格之间的边界;两者都是 非单词 字符,\b 锚永远不会在那里匹配。

    2. 您正在传递 re1.,这意味着“匹配 1 和任何其他字符”。您需要使用 re.escape() 来转义点以匹配文字 .

    以下效果更好:

    re.search(r"%s(?:\s|$)" % re.escape(Str2), Str1, re.IGNORECASE)
    

    现在它将按字面意思匹配您的输入,并查找后面的空格或字符串的结尾。 (?:...) 创建一个非捕获组(除非您特别需要捕获匹配的部分,否则始终是一个好主意);组内有一个| 管道,提供两种选择;匹配\s(空格)或匹配$(行尾)。您可以根据需要扩展它。

    演示:

    >>> import re
    >>> Str1 = "1. how are you doing"
    >>> Str2 = "1."
    >>> re.search(r"%s(?:\s|$)" % re.escape(Str2), Str1, re.IGNORECASE)
    <_sre.SRE_Match object at 0x10457eed0>
    >>> _.group(0)
    '1. '
    

    【讨论】:

    • +1。改进的正则表达式的一些小细节:1)尾随空格匹配。 2) Str1 = "11. No way!" 会匹配。
    • 太棒了!您能否详细说明您使用的正则表达式?会有助于理解。
    • @suzee:Martijn 可能会详细说明,但现在请查看docs,看看你是否可以搞定。这是一种很好的学习方式。
    • @StevenRumbalski:OP 没有详细说明目标是什么;我的印象是它更像是一个布尔测试(表达式匹配或不匹配),这使得在匹配的输出中包含空格没有实际意义。这里的主要问题是 \b 没有锚定 OP 期望它锚定的位置,但是如果应该允许一个单词字符 as well 作为空格,你也可以使用 if Str2 in Str1:并完全放弃正则表达式。
    猜你喜欢
    • 2012-07-10
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多