Python使用regex为指定列表单词前的词汇末尾加逗号求解
问题描述
现有单词列表:list_words =["cat","dog","animals"]
待处理文本:text = "I have a lot of animals a cat and a dog"
需求为使用正则实现:列表中任意完整独立单词的前一个单词末尾添加逗号,预期输出为:text = "I have a lot of, animals a, cat and a, dog"
现有实现存在两个问题:
- 误匹配:如果文本中存在包含列表单词的更长词汇(例如dogy包含dog),也会触发替换,仅需匹配完整独立的目标单词
- 重复添加逗号:如果列表单词前已经存在逗号,仍会额外新增逗号,不符合要求
实现方案
直接通过单条正则批量完成匹配替换,同时解决上述两个问题,代码如下:
import re list_words = ["cat", "dog", "animals","adam"] text = "I have a lot of animals, cat and a dog dogy test" # 转义单词中的正则特殊字符,拼接成正则多选分支 target_words = '|'.join(re.escape(word) for word in list_words) # 构建正则:匹配前面无逗号、后跟完整目标单词的空白串 pattern = re.compile(r'(?<!,)\s+\b(%s)\b' % target_words) # 替换:在空白串前加逗号,保留原有空格和目标单词 result = pattern.sub(r', \1', text) print(result)
方案说明
- 解决误匹配问题:使用单词边界符
\b包裹目标单词,仅匹配前后为非单词字符的独立完整单词,不会命中长单词中的目标词片段 - 解决重复加逗号问题:使用负向向后断言
(?<!,),仅匹配目标单词前的空白符前没有逗号的场景,已有逗号的位置不会触发替换 - 无需循环遍历每个单词做多次替换,单次正则替换即可完成所有匹配,执行效率更高
内容的提问来源于stack exchange,提问作者Adil kasbaoui
相关产品推荐
相关产品推荐

