Python正则表达式问题:匹配含'olo'但首尾不含该串的单词
Python正则表达式修正:匹配包含'olo'但不以其首尾的单词
问题需求
查找文本中包含字符串'olo'但不以'olo'开头或结尾的单词。
原代码及问题
原代码尝试实现该需求,但输出结果截断了部分单词的末尾字符:
import re example_text = "Lorem ipsum dolorolo at sit amet, dolore dolor dolore" re_pattern = r'(?!\bolo)(\wolo\w)(?!\w*olo\b)' re_search = re.findall(re_pattern, example_text) print(re_search)
当前输出:
['dolor', 'dolor', 'dolor']
预期输出:
['dolore', 'dolor', 'dolore']
问题分析
原正则表达式的问题在于:
- 捕获组
(\wolo\w)仅匹配了'olo'前后各一个字符的片段,而非整个单词,导致截断了完整单词(比如dolore被截取为dolor)。 - 末尾的负向断言
(?!\w*olo\b)逻辑错误,无法正确排除以'olo'结尾的单词。
修正后的代码
调整正则表达式,匹配整个单词并满足三个条件:包含'olo'、不以'olo'开头、不以'olo'结尾:
import re example_text = "Lorem ipsum dolorolo at sit amet, dolore dolor dolore" # 修正后的正则表达式 re_pattern = r'\b(?!olo)\w*olo\w*(?<!olo)\b' re_search = re.findall(re_pattern, example_text) print(re_search)
输出结果:
['dolore', 'dolor', 'dolore']
正则解释
\b:匹配单词边界,确保处理的是完整单词。(?!olo):负向预查,排除以'olo'开头的单词。\w*olo\w*:匹配包含'olo'子串的任意字母/数字/下划线组成的单词(\w*匹配0个或多个单词字符)。(?<!olo):负向后查,排除以'olo'结尾的单词。\b:再次匹配单词边界,确保匹配的是完整单词。
内容的提问来源于stack exchange,提问作者Iryna Ylinen
相关产品推荐
相关产品推荐

