【发布时间】:2020-07-19 05:17:00
【问题描述】:
我有一个数据框,我需要在其中找到与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
输出是
Match_text results
0 foo abc [foo]
3 baz 45 [baz]
6 foo baz [foo, baz]
其中,foo baz 还与第 6 行以及 foo 和 baz 匹配。我需要为terms中的所有匹配获取行
【问题讨论】:
-
想要的输出是什么?
-
我还需要与
foo baz匹配的行,即第 6 行 -
也许你想使用正则表达式
\b(?:foo baz|foo|baz)\b。 Demo。请注意,foo baz必须是交替中的第一个词。 -
是的,你的建议工作@cary。但我不能保证每次都会自动生成正常的模式。
-
@Raghu 试试
pat = r'\b(?:{})\b'.format('|'.join(sorted(terms,key=len,reverse=True))),对你有用吗?我不确定最终的行结果应该是什么,[foo baz]或[foo, baz, foo baz]?我对两者都有解决方案。
标签: python regex pandas dataframe