python - 当里面有额外的括号时如何添加右括号

标签 python regex

我正在做一个“解析器”,它必须用另一个关键字替换一个关键字

trim(<something>)  --> ltrim(rtrim(<something>))

我正在使用 python 正则表达式。 主要问题是因为在 <something>部分可能会有额外的括号,这使得形成正则表达式对我来说非常困难。只需添加 ?使其非贪婪并没有真正起作用,并且将正则表达式设置为贪婪将与文件末尾的括号相匹配 200 行。 从一开始我就假设其他人有这个问题,然后我发现了这两个问题。

How to correctly parse closing parentheses

How to add a missing closing parenthesis to a string in Python?

但对我来说都没有帮助, 到目前为止我的代码:

def run(path):
for root, dirs, files in os.walk(path):
    for fname in files:
        fpath = os.path.join(root, fname)
        with open(fpath, 'r') as f:
            s = f.read()
        s = s.replace("trim","ltrim(rtrim" )
        text = s
        text = re.sub(r'(\(.+(?!\))\b)', r"\1)", text)
        return text

代码只是添加了关闭 )即使我放置了 +,也不包含中间的文本在我的正则表达式中,这应该意味着任何字符至少出现一次。

像这样

trim(p_name)变成 ltrim(rtrim()p_name)

我需要它是 ltrim(rtrim(p_name))

最佳答案

您无法将递归模式与内置 Python 匹配 re ,所以你必须 pip install regex安装 PyPi 正则表达式模块并使用

return regex.sub(r'\btrim(\((?:[^()]++|(?1))*\))', r'ltrim(r\g<0>)', text) )

参见 regex demo .

详细信息:

  • \btrim - 匹配整个单词 trim
  • (\((?:[^()]++|(?1))*\)) - 第 1 组:
    • \( - 一个 (字符
    • (?:[^()]++|(?1))* - 除 ( 以外的零个或多个字符和 )或整个第 1 组模式(递归)
    • \) - 一个 )字符。

替换为 ltrim(r\g<0>) : ltrim(r + 整场比赛 + ) .

参见 Python demo :

import regex
text = "trim(str(p_name))"
print( regex.sub(r'\btrim(\((?:[^()]++|(?1))*\))', r'ltrim(r\g<0>)', text) )
## => ltrim(rtrim(str(p_name)))

关于python - 当里面有额外的括号时如何添加右括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67686271/

相关文章:

Python - 无法访问类中的变量

python - 如何遍历所有 wx.CheckBox 实例?

python - Scipy Weibull 参数置信区间

python - 无法从 google.cloud 导入数据存储

mysql - 将 MySQL "INSERT"命令转换为文本

regex - 使用 grep 正则表达式从 arp 表中提取 MAC 地址

python - 正则表达式匹配所有带有引号的句子

javascript - 删除最后一个反斜杠后的所有内容

python - 在 Python 中解构赋值顺序

python - 如何使用python读取文件?