我正在尝试查找客户注释中何时提及特定产品名称(即非标准化、困惑的文本)。产品名称是“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
另一种方法可能是使用正向先行检查空白字符或 .,或使用 (?=[\s,.]|$) 的字符串结尾
例如:
str5 ="The best product is Lending qb."
print(re.findall(r'(?<!\S)lending\s?qb(?=[\s,.]|$)', str5, re.IGNORECASE)) # ['Lending qb']
