簡體   English   中英

如何使用 str.contains 在正則表達式中獲取模式匹配列表?

[英]How to get list of patterns match in regex using str.contains?

我有一個數據框dfMatch_text列中有一些文本。 我使用正則表達式\b邊界條件將Match_textterms匹配。 我得到了預期的結果,但我還需要打印與df匹配的模式。 在這種情況下, foobaz\b匹配。 我如何也得到這些條款?

texts = ['foo abc', 'foobar xyz', 'xyz baz32', 'baz 45','fooz','bazzar','foo baz']
terms = ['foo','ball','baz','apple']
df = pd.DataFrame({'Match_text': texts})
pat = r'\b(?:{})\b'.format('|'.join(terms))
df[df['Match_text'].str.contains(pat)]

output 是

    Match_text
0   foo abc
3   baz 45
6   foo baz

除了這個 output 我還需要foo, baz,foo

一種方法是在當前生成的數據框中添加一個新列,該列僅包含匹配的術語,並刪除所有其他不匹配的單詞:

terms_regex = r'(?:{})'.format('|'.join(terms))
df['Match_terms'] = re.sub(r'\s*\b(?!' + pat1 + r')\S+\b\s*', '', df['Match_text']

在這里要清楚,我用來刪除不匹配單詞的正則表達式是:

\s*\b(?!(?:foo|ball|baz|apple))\S+\b\s*

這將匹配任何不是您的關鍵字之一的術語,以及可選的周圍空格,並將其替換為空字符串。

有點冗長恕我直言,讓我知道它是否符合您的用例:

df['content'] = df[df['Match_text'].str.contains(pat)]
(df
 .dropna()
 .assign(temp = lambda x: x.content.str.split())
 .explode('temp')
 .reset_index()
 .assign(present=lambda x: x.loc[x.temp.isin(terms),'temp'])
 .dropna()
 .drop(['temp','content'],axis=1)
)

 index  Match_text  present
0   0   foo abc      foo
2   3   baz 45       baz
4   6   foo baz      foo
5   6   foo baz      baz

或者,您可以使用一些正則表達式:

   M = df.loc[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 M.Match_text.tolist()]

#assign results to a new column
M = M.assign(content = results)

M

        Match_text  content
0        foo abc    [foo]
3        baz 45     [baz]
6        foo baz    [foo, baz]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM