【问题标题】:How to match a string in a sentence如何匹配句子中的字符串
【发布时间】:2018-07-16 14:34:03
【问题描述】:

我想检查一个特定的字符串是否存在于一个句子中。我为此目的使用了简单的代码

subStr = 'joker'
Sent = 'Hello World I am Joker'

if subStr.lower() in Sent.lower():
    print('found')

这是一种简单直接的方法,但是当句子显示为

时它会失败

你好,我是小丑

你好,我是小丑

当我从 PDF 文件中解析句子时,一些不必要的空格会出现在这里和那里。

解决此问题的一种简单方法是删除句子中的所有空格并查找子字符串匹配项。我想知道其他人对此的看法,我应该坚持这种方法还是寻找其他替代方法。

【问题讨论】:

  • 如果您的输入具有任意间距,如何区分“今天”和“今天”?

标签: python string python-3.x string-matching


【解决方案1】:

对于小字符串,这比replace 更有效,对于大字符串更昂贵。它不会处理模棱两可的情况,例如“今天”与“今天”。

subStr in ''.join(Sent.split()).lower()  # True

【讨论】:

  • 一项快速测试表明,这大约是使用 subStr Sent.replace(' ', '').lower() 的一半——如果发送时间很短会更好,如果发送时间很长会更糟。
  • @NathanVērzemnieks,我会更新我的答案。根据 OP,我的测试是针对小字符串的。
【解决方案2】:

你可以使用正则表达式:

import re
word_pattern = re.compile(r'j\s*o\s*k\s*e\s*r', re.I)
sent = 'Hello World I am Joker'
if word_pattern.search(sent):
    print('found')

我希望这行得通

【讨论】:

    【解决方案3】:

    试试这个。这可能会在某个地方意外中断。但是对于您的用例,这可能会起作用

    In [1]: Sent = 'Hello World I am Joker'
    
    In [3]: subStr = 'Joker'
    
    In [4]: if subStr in Sent.replace(' ', ''):
       ...:     print("Do something")
       ...:     
    Do something
    

    【讨论】:

      【解决方案4】:

      您提出的方法 - 删除空格 - 似乎简单有效(在一些简单的测试中,比其他建议快两到十倍)。但是,如果您需要最大限度地减少误报,则使用正则表达式方法可能会更好。您可以添加单词边界以避免部分单词匹配,并检查匹配的子字符串以查看是否有任何空格可能是真实空格,可能通过匹配规范单词列表。

      >>> sentence = 'Were the fields ever green? - they were never green.'
      >>> target = 'evergreen'
      >>> pattern = re.compile(r'\b' + '\s*'.join(target) + r'\b')
      >>> pattern.findall(sentence) # only one match because of \b
      ['ever green']
      >>> matching_words = pattern.findall(sentence)[0].split()
      >>> all(word in dictionary for word in matching_words)
      True
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-07
        • 2020-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        相关资源
        最近更新 更多