如何使用正则环视实现括号与引号相关的条件正则替换任务?
正则替换优化:排除特定区域内的
str替换 需求背景
现有Python正则替换代码:
import re line = re.sub(r"\bstr\b", ":class:`str`", line)
需要调整逻辑:仅当str不在以下范围时才执行替换:
- 反引号
`包裹的区域 - 尖括号
<>包裹的区域 - 方括号
[]内部区域
解决方案
基础版本(无嵌套场景)
通过正则匹配所有需要排除的区域,对这些区域直接保留原内容,仅替换不在区域内的str:
import re def replace_target_str(line): def replace_callback(match): # 若匹配到排除区域,直接返回原内容 if match.group(1): return match.group(1) # 否则替换str为目标格式 return ":class:`str`" # 正则规则:匹配排除区域(捕获组1)或独立的str pattern = r"(`[^`]*`|\[[^\]]*\]|<[^>]*>)|\bstr\b" return re.sub(pattern, replace_callback, line)
嵌套场景适配版本
如果存在嵌套的方括号/尖括号(如Union[List[str], int]),需要用平衡组处理嵌套结构,使用re.VERBOSE模式提升可读性:
import re def replace_target_str_nested(line): def replace_callback(match): if match.group(1): return match.group(1) return ":class:`str`" # 支持嵌套的正则规则 pattern = r""" # 匹配三种排除区域 ( `[^`]*` # 反引号包裹内容 | \[(?:[^[\]]|(?R))*\] # 嵌套方括号内容 | <(?:[^<>]|(?R))*> # 嵌套尖括号内容 ) | \bstr\b # 匹配独立的str """ return re.sub(pattern, replace_callback, line, flags=re.VERBOSE)
效果验证
测试输入:
line = r"""list of str and list of :class:`str` or :class:`string <str>` or Union[str, Tuple[int, str]]"""
调用replace_target_str(line)后输出:
"list of :class:`str` and list of :class:`str` or :class:`string <str>` or Union[str, Tuple[int, str]]"
内容的提问来源于stack exchange,提问作者ProGamerGov
相关产品推荐
相关产品推荐

