如何执行这个条件正则表达式替换任务,使用括号和引号字符的查找?



目前我有这个作为regex的替换:

import re
line = re.sub(r"bstrb", ":class:`str`", line)

我想要一个如下的结果,其中<>和`停止替换发生,如果在方括号内,则不发生替换。我试着只对其中一个角色执行负面环视,但我无法实现。

示例输入:

line = r"""list of str and list of :class:`str` or :class:`string <str>` or Union[str, Tuple[int, str]]"""

我的目标输出示例:

"list of :class:`str` and list of :class:`str` or :class:`string <str>` or Union[str, Tuple[int, str]]"

这里有一个具有负向后看和负向前看的解决方案。

line = r"""list of str and list of :class:`str` or :class:`string <str>` or Union[str, Tuple[int, str]]"""
pattern = r"(?<![[`<])(str)(?![]`>])"
re.sub(pattern, r":class:`str`", line)

输出:

list of :class:`str` and list of :class:`str` or :class:`string <str>` or Union[str, Tuple[int, str]]

检查Regex101 上的Regex

更新评论中的问题
这是我的条件子方法,基于@Valdi_Bo 的这种方法的思想

line = r"""list of str and list of :class:`str` or :class:`string <str>` or Union[str, Tuple[int, str]]"""
pattern = r"bstrb"
def conditional_sub(match):
if not line[match.start()-1] in ['[', '`','<'] and not line[match.end()] in [']', '`', '>']:
return r":class:`str`"
else:
return r"~str"
re.sub(pattern, conditional_sub, line)

输出:

list of :class:`str` and list of :class:`~str` or :class:`string <~str>` or Union[~str, Tuple[int, ~str]]

CCD_ 3和CCD_。有了它们,我们可以像前面的模式一样检查前面/后面的符号,并决定替换什么。

最新更新