You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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']

问题分析

原正则表达式的问题在于:

  1. 捕获组(\wolo\w)仅匹配了'olo'前后各一个字符的片段,而非整个单词,导致截断了完整单词(比如dolore被截取为dolor)。
  2. 末尾的负向断言(?!\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:56:01