Python 如何将列表中的精确字符串与考虑到空格的较大字符串进行匹配?

Python 如何将列表中的精确字符串与考虑到空格的较大字符串进行匹配?,python,Python,我有一个很大的字符串列表,我想检查一个字符串是否出现在一个较大的字符串中。该列表包含一个单词的字符串以及多个单词的字符串。为此,我编写了以下代码: example_list = ['pain', 'chestpain', 'headache', 'sickness', 'morning sickness'] example_text = "The patient has kneepain as wel as a headache" emptylist = [] for i in example

我有一个很大的字符串列表,我想检查一个字符串是否出现在一个较大的字符串中。该列表包含一个单词的字符串以及多个单词的字符串。为此,我编写了以下代码:

example_list = ['pain', 'chestpain', 'headache', 'sickness', 'morning sickness']
example_text = "The patient has kneepain as wel as a headache"

emptylist = []
for i in example_text:
    res = [ele for ele in example_list if(ele in i)]
    emptylist.append(res)
然而,这里的问题是“pain”也被添加到了emptylist中,这是不应该的,因为我只希望在与文本完全匹配的情况下添加示例列表中的内容。我还尝试使用集合:

word_set = set(example_list)
phrase_set = set(example_text.split())
word_set.intersection(phrase_set)

然而,这将“晨吐”分为“晨吐”和“呕吐”。有人知道解决这个问题的正确方法吗?

您应该能够使用使用单词边界的正则表达式

>>> import re
>>> [word for word in example_list if re.search(r'\b{}\b'.format(word), example_text)]
['headache']

这与
'kneepain'
中的
'pain'
不匹配,因为它不是以单词边界开头的。但是它会正确地匹配包含空格的子字符串。

使用PyParsing:

将pyparsing导入为pp
示例_list=[‘疼痛’、‘胸痛’、‘头痛’、‘恶心’、‘晨吐’]
示例\u text=“患者有膝盖疼痛和头痛晨吐”
匹配项列表=[]
对于示例_列表中的单词:
规则=pp.OneOrMore(pp.Keyword(单词))
对于rule.scanString中的t、s、e(示例文本):
如果t:
匹配项的列表。追加(t[0])
打印(匹配项列表)
这将产生:

[‘头痛’、‘恶心’、‘晨吐’]

会员们在这篇文章中已经提供了很好的例子

我对疼痛不止一次的匹配文本进行了挑战。我还想了解更多关于比赛地点的信息。我最终得到了以下代码

我写了下面的句子

“患者不仅有膝盖疼痛,还有头痛、手臂疼痛、胃痛和疾病”
重新导入
从集合导入defaultdict
示例_list=[‘疼痛’、‘胸痛’、‘头痛’、‘恶心’、‘晨吐’]
示例_text=“患者不仅有膝盖疼痛,还有头痛、手臂疼痛、胃痛和疾病”
TruthFalseDict=defaultdict(列表)
对于示例_列表中的i:
MatchedTruths=re.finditer(r'\b%s\b'%i,示例\u文本)
如果匹配实际情况:
对于j in matchedTruth:
TruthFalseDict[i].append(j.start())
打印(dict(真假dict))
上面给出了以下输出

{'pain':[55,69],'头痛':[38],'disease':[78]}

您可能需要使用regex,您可以在网上找到大量的资源。正如Stefan所说,如何处理诸如“痛苦”之类的单词?哎呀,需要在子字符串的前后都有一个单词边界。编辑以解决此问题。
example\u text=“患者有膝盖疼痛和头痛晨吐”
导致
[“头痛”、“恶心”、“晨吐”]
@Raphael,从技术上讲,根据OP的问题描述,这将是正确的输出。感谢@CoryKramer,这对示例有效,但当我尝试将其应用于70000多个术语的实际列表时,我得到
错误:位置55处的不平衡括号。谷歌让我转义括号,但我不明白怎么做?嗨,拉斐尔,谢谢你的回答!看起来这个答案最适合我的情况。不过我还有一个问题,我的列表包含74000个值,大多数需要匹配的文本在30到180个单词之间。这使得代码需要很长时间才能运行。您知道如何使此代码更高效/运行更快吗?运行需要多长时间?是由于列表的原因还是由于解析本身的原因需要更长的时间?列表非常慢,如果可以,请使用set()或dict(),现在请使用“pp.OneOrMore”进行尝试。我编辑了答案。您还可以拆分列表并使用多处理作为最后手段。看看这篇文章(关于在python中附加到列表的速度有多慢):对于30个单词的文本,ZeroOrMore的时间是80秒,而现在使用OneOrMore的时间是30秒。问题在于我怀疑列表的长度,因为当我将列表缩短时,代码会立即运行。您的意思是我应该尝试将我的
示例列表
更改为字典或集合,还是我应该更改
示例列表中的匹配项
?时间接收器可能不是更新
示例列表中的匹配项
所需的时间,而是您在
示例列表
中对每个条目扫描一次输入的事实。您可以使用
rule=pp.oneOf(example\u list,asKeyword=True)
创建一个合并规则(尽管有74000个条目,创建此规则需要一段时间)。然后,您可以对所有不同的文本重复使用此规则(不要每次都重新创建它)。