[英]How get all matches using str.contains in python regex?
我有一个数据框,我需要在其中找到与terms
匹配的所有可能匹配行。 我的代码是
texts = ['foo abc', 'foobar xyz', 'xyz baz32', 'baz 45','fooz','bazzar','foo baz']
terms = ['foo','baz','foo baz']
# create df
df = pd.DataFrame({'Match_text': texts})
#cretae pattern
pat = r'\b(?:{})\b'.format('|'.join(terms))
# use str.contains to find matchs
df = df[df['Match_text'].str.contains(pat)]
#create pattern
p = re.compile(pat)
#search for pattern in the column
results = [p.findall(text) for text in df.Match_text.tolist()]
df['results'] = results
output 是
Match_text results
0 foo abc [foo]
3 baz 45 [baz]
6 foo baz [foo, baz]
其中, foo baz
还与第 6 行以及foo
和baz
匹配。 我需要获取terms
中所有匹配项的行
较长的替代品应该在较短的替代品之前,因此,您需要按长度按降序对关键字进行排序:
pat = r'\b(?:{})\b'.format('|'.join(sorted(terms,key=len,reverse=True)))
结果将是\b(?:foo baz|foo|baz)\b
模式。 它将首先尝试匹配foo baz
,然后是foo
,然后是baz
。 如果找到foo baz
,则返回匹配项,然后从匹配项的末尾开始搜索下一个匹配项,因此您不会再次将找到的foo
或baz
与上一个匹配项匹配。
在“记住正则表达式引擎是急切的”中查看更多信息。
而不是使用正则表达式模式来检查术语的存在,
#create pattern
p = re.compile(pat)
#search for pattern in the column
results = [p.findall(text) for text in df.Match_text.tolist()]
尝试像这样在文本中使用简单的术语查找。
#search for each term in the column
results = [[term for term in terms if term in text] for text in df.Match_text.tolist()]
上面的 Output 看起来像这样,
Match_text results
0 foo abc [foo]
3 baz 45 [baz]
6 foo baz [foo, baz, foo baz]
注意:此方法存在时间复杂度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.