【问题标题】:Find a string inside another string using re使用 re 在另一个字符串中查找一个字符串
【发布时间】:2018-02-26 04:13:04
【问题描述】:

我知道之前有人问过这个问题,但今天早些时候我在 SO 中找到了以下代码:

import re   

def findIfWordMatch(w):
    return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search

例如,如果我使用以下字符串,如果在 text2 中找到 text1,则该函数返回一个匹配对象(否则该函数返回 None):

text1 = 'DIBUJO'
text2 = 'DIBUJO B308'

所以要知道 text1 是否在 text2 中,我执行以下操作:

if(findIfWordMatch(text1)(text2) is not None):  
    #doSomething()

在我使用这些变量之前,它一直运行良好:

text1 = 'INT.EST.C.S.'
text2 = 'INT.EST.C.S. B308'

我几乎可以肯定它与点无关,因为我还有其他具有类似结构的变量并且工作正常,所以..

我想知道为什么会发生这种情况,或者用另一种方法来查找字符串是否在另一个字符串中。

谢谢指教

【问题讨论】:

标签: python regex python-3.x


【解决方案1】:
'INT.EST.C.S. B308'
            ^^

点和空格'. ',在正则表达式中等同于\W\W,不被视为字边界\b(^\w|\w$|\W\w|\w\W) 的一部分。使用负锁定(?<!)(?!)

正则表达式(?<!\S){0}(?!\S)

【讨论】:

  • 尽管知道如何使它工作,但我仍然不确定为什么它不起作用。很好发现。
  • 为什么当我们在编译regex时使用一个字符串而不转义dots它仍然匹配dots不应该被视为match anything
  • 补偿:-)
【解决方案2】:

试试这个吧。

text1 = 'INT.EST.C.S.'
text2 = 'INT.EST.C.S. B308'

if text1 in text2:
  print("yes!")

【讨论】:

    【解决方案3】:

    '.' 用于匹配任何字符。所以你的模式比它应该匹配的更多。

    您可以通过转义点来正确格式化您的图案。

    text1 = r'INT\.EST\.C\.S\.'
    

    或者由于这是一个简单的模式,您可以使用in 来检查text1 是否包含在text2

    if text1 in text2:  
        #doSomething()
    

    【讨论】:

    • 这是一个 hack,仅适用于这种特定情况。如何根据findIfWordMatch()中的变量w中的值自动转义点。
    • 这不是 hack,它只是正确地格式化你的模式。 findIfWordMatch 仅应在必须匹配模式时使用,因此用户应该知道他们必须提供模式。如果不是,则应使用in
    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2013-11-19
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多