python - 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)
”)
有什么建议么?
交流电
解决方案
该模式(?!\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']
推荐阅读
- c# - 如何在其他环境中删除 appsettings.json 中的节点?
- xml - 编辑 XML 中的特定内容
- python - 玩家和敌人的碰撞问题
- node.js - Discord 机器人无法在 Heroku 上说话
- docker - 码头工人的corda jolokia
- haskell - 使用 GADT 和构造函数子集的 C 语言 AST
- spring-boot - Thymeleaf 访问 DOM 元素属性
- sql - 操作数类型冲突:日期与 int 不兼容?
- flutter - 如何使用 Navigator 将数据传递到 Flutter 中的上一个屏幕?(需要处理所有情况:滑动返回,按返回等)
- google-cloud-platform - 如何在通配符查询的结果中包含表名?