【问题标题】:How to match an exact word inside a string?如何匹配字符串中的确切单词?
【发布时间】:2016-11-16 09:17:06
【问题描述】:
op = ['TRAIL_RATE_ID 8 TRAIL_RATE_NAME VC-4 TRAIL_ORDER High Order ',    'TRAIL_RATE_ID 9 TRAIL_RATE_NAME VC4-4 TRAIL_ORDER High Order ' , 'TRAIL_RATE_ID 10 TRAIL_RATE_NAME VC-8 TRAIL_ORDER High Order ']
word = "8"
for op1 in op:
    pp=re.search('(\\b'+word +'\\b)', op1, flags=re.IGNORECASE|re.DOTALL)
    print bool(pp)

匹配 2 个出现的 8。

我希望它只匹配第一次出现。这个词可以 字=“8” 字=“$#hhd” word = "你好"

如何使用正则表达式匹配?

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    单词边界无济于事,因为- 不被视为单词字符。

    您可以使用环视:

    p = re.compile(r'(?:(?<=^)|(?<=\s))' + word + r'(?=\s|$)', flags=re.IGNORECASE|re.M)
    re.search(p, op1)
    

    Code Demo

    • (?&lt;=^)|(?&lt;=\s) 是一个后向检查,以确保我们在单词之前有行开头或空格
    • (?=\s|$) 是一个前瞻,以确保我们的单词旁边有行尾或空格

    【讨论】:

    • 无论这个答案获得多少赞成票 (re.search('(?&lt;=\\s|^)' + word + '(?=\\s|$)', op1, flags=re.IGNORECASE|re.M)),它都不会正确。请在投票前检查,否则投票/反对的全部意义是没有意义的。
    • 是的,你是对的 Wiktor。现在已更正。很抱歉不得不离开去参加会议。我不是核心 python 开发人员,被 regex101 代码生成器愚弄了 :)
    【解决方案2】:

    你可以要求单词两边不能有非空白符号:

    r'(?<!\S){0}(?!\S)'.format(re.escape(word))
    

    regex demo

    我添加了re.escape(word),以防您的关键字包含应按字面处理的特殊正则表达式元字符。

    Python demo:

    import re
    word = "8"
    pat = r'(?<!\S){0}(?!\S)'.format(re.escape(word))
    print re.search(pat,"nnn 8", flags=re.IGNORECASE)
    

    【讨论】:

    • 另外,在 Python 中定义正则表达式模式时使用原始字符串文字 - 可以省去很多麻烦。
    • 这应该是正确的答案 - Python 只支持 固定宽度 后视 (+1)。在 The double negative delimiter 上阅读有关 Wiktor 解决方案的更多信息
    • @Jan:更多,lookbehind 中的替代分支应该是等长的。 (?&lt;=\s|\d) 会起作用。
    • 很高兴它有效,然后请考虑接受答案。它更短,使用更少的资源,因为lookbehinds 的数量为1(并且我的模式没有交替 - 并且未锚定的lookbehinds 在性能方面代价高昂),并且更具可读性。并且您不需要使用此模式的任何额外标志(但如果您需要忽略大小写,则需要 re.I)。
    • @SaiKumar 试试r'(?&lt;!\S){0}[^\w\s]?(?!\S)'。可能不是这样,我需要更多的输入、要匹配的示例字符串以及应该避免这些匹配的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2014-07-30
    • 2012-01-22
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多