【问题标题】:How to make word boundary \b not match on dashes如何使单词边界\ b在破折号上不匹配
【发布时间】:2017-02-02 17:46:52
【问题描述】:

我将代码简化为我遇到的具体问题。

import re
pattern = re.compile(r'\bword\b')
result = pattern.sub(lambda x: "match", "-word- word")

我得到了

'-match- match'

但我想要

'-word- match'

编辑:

或者对于字符串"word -word-"

我想要

"match -word-"

【问题讨论】:

    标签: python regex


    【解决方案1】:

    你需要的是消极的回顾。

    pattern = re.compile(r'(?<!-)\bword\b')
    result = pattern.sub(lambda x: "match", "-word- word")
    

    引用documentation

    (?&lt;!...) 如果字符串中的当前位置前面没有匹配 ....

    则匹配

    所以这只会匹配,如果断词 \b 前面没有减号 -

    如果你需要在字符串的结尾使用这个,你必须使用一个否定的前瞻,它看起来像这样:(?!-)。完整的正则表达式将导致:(?&lt;!-)\bword(?!-)\b

    【讨论】:

      【解决方案2】:

      \b 基本上表示除[a-zA-Z0-9_] 之外的字符上的单词边界,其中也包括空格。用否定的环视包围word,以确保其前后没有非空格字符:

      re.compile(r'(?<!\S)word(?!\S)')
      

      【讨论】:

        【解决方案3】:

        除了单词边界之外,您还可以使用(\s|^)(\s|$) 模式匹配单词前后的字符。

        细分\s 匹配每个空白字符,这似乎是您想要实现的目标,因为您排除了破折号。 ^$ 确保如果单词是字符串中的第一个或最后一个(即之前或之后没有字符),它们也匹配。

        你的代码会变成这样:

        pattern = re.compile(r'(\s|^)(word)(\s|$)')
        result = pattern.sub(r"\1match\3", "-word- word")
        

        因为这个解决方案使用了诸如\s 这样的字符类,这意味着它们可以很容易地被替换或扩展。例如,如果您希望您的单词由空格或逗号分隔,您的模式将变成这样:r'(,|\s|^)(word)(,|\s|$)'

        【讨论】:

          猜你喜欢
          • 2016-09-25
          • 2012-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-17
          相关资源
          最近更新 更多