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

如何使用正则环视实现括号与引号相关的条件正则替换任务?

正则替换优化:排除特定区域内的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 &lt;str&gt;` or Union[str, Tuple[int, str]]"""

调用replace_target_str(line)后输出:

"list of :class:`str` and list of :class:`str` or :class:`string &lt;str&gt;` or Union[str, Tuple[int, str]]"

内容的提问来源于stack exchange,提问作者ProGamerGov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:36:07