Skip to main content
 首页 » 编程设计

Python 正则表达式 : Find specific phrase in any form in text (including if followed by . 或 ,)

2024年09月03日42xing901022

我正在尝试查找客户注释中何时提及特定产品名称(即非标准化、困惑的文本)。产品名称是“Lending QB”。在文本中,产品名称可以以下列任何方式出现:

str1 ='Lending QB is a great product.' 
str2 ='lending qb is great.' 
str3 ='I don't think lendingqb is great.' 
str4 ='I like Lending QB, but not always.' 
str5 ='The best product is Lending qb.' 

这是最有效的正则表达式:

df['lendingQB'] = df['Text'].str.findall('(?i)(?<!\S)lending\s?qb(?!\S)', re.IGNORECASE) 

使用 regex101.com测试并在我的 Python 程序中确认,我可以捕获字符串 (str) 1-3 中的产品名称,但不能捕获 4 和 5;这让我相信问题在于当产品名称后跟标点符号时找不到它。

我的理解是 \S 会包含逗号和句点。

我尝试将 |[,.] 添加到正则表达式,但没有任何匹配项:

'(?i)(?<!\S)lending\s?qb(?!\S|[,.])' 

(我意识到 IGNORECASE 是多余的,但为了使用 regex101.com 进行测试,我添加了“(?i)”)

有什么建议吗?

空调

请您参考如下方法:

图案 (?!\S)使用否定先行检查后面的内容不是非空白字符。

您可以这样替换 (?!\S)带有单词边界 \b让它不成为更大匹配的一部分:

(?i)(?<!\S)lending\s?qb\b

Regex demo

另一种方法可能是使用正向先行检查空白字符或 .,或使用 (?=[\s,.]|$) 的字符串结尾

例如:

str5 ="The best product is Lending qb." 
print(re.findall(r'(?<!\S)lending\s?qb(?=[\s,.]|$)', str5, re.IGNORECASE))  # ['Lending qb']