gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:57:22 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com