首页 > 解决方案 > Python 正则表达式:在文本中以任何形式查找特定短语(包括如果后跟 . 或 ,)

问题描述

我试图找出客户备注中何时提及特定产品名称(即非标准化、凌乱的文本)。产品名称为“借贷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)”)

有什么建议么?

交流电

标签: pythonregex

解决方案


该模式(?!\S)使用负前瞻来检查后面的不是非空白字符。

你可以这样做是(?!\S)用一个单词边界替换\b它,让它不成为更大匹配的一部分:

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

正则表达式演示

另一种方法是使用积极的前瞻来检查空格字符或.,字符串的结尾,使用(?=[\s,.]|$)

例如:

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

推荐阅读