如何匹配句子中的字符串

时间:2018-02-06 13:45:21

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

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

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

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

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

时会失败
  

你好世界我是Jo ker

     

你好世界我是J oker

当我从PDF文件中解析句子时,会有一些不必要的空间来到这里。

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

4 个答案:

答案 0 :(得分: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')

我希望这有效

答案 1 :(得分:2)

对于小字符串,这比replace更有效,对于大字符串则更贵。它不会处理模棱两可的案件,例如:到了白天' vs'今天'。

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

答案 2 :(得分:0)

试试这个。这可能会意外地突破某个地方。但对于您的用例,这可能会起作用

In [1]: Sent = 'Hello World I am Joker'

In [3]: subStr = 'Joker'

In [4]: if subStr in Sent.replace(' ', ''):
   ...:     print("Do something")
   ...:     
Do something

答案 3 :(得分:0)

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

>>> 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