Python 当括号内有其他括号时,如何添加右括号

Python 当括号内有其他括号时,如何添加右括号,python,regex,Python,Regex,我正在做一个“解析器”,它必须用另一个关键字替换一个关键字 trim(<something>) --> ltrim(rtrim(<something>)) 尽管我在正则表达式中放置了一个+,这意味着至少有一个字符出现,但代码只是添加了结尾),而没有在中间包含文本 像这样 trim(p\u name)变成ltrim(rtrim()p\u name) 我需要它是ltrim(rtrim(p_name))您无法将递归模式与内置Pythonre匹配,因此您必须pip in

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

trim(<something>)  --> ltrim(rtrim(<something>))
尽管我在正则表达式中放置了一个
+
,这意味着至少有一个字符出现,但代码只是添加了结尾
,而没有在中间包含文本

像这样

trim(p\u name)
变成
ltrim(rtrim()p\u name)


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

您无法将递归模式与内置Python
re
匹配,因此您必须
pip install regex
才能安装PyPi regex模块并使用

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

详情:

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

见:

导入正则表达式
text=“trim(str(p_name))”
打印(regex.sub(r'\btrim(\((?:[^()])+++(?1))*\)',r'ltrim(r\g'),文本))
##=>ltrim(rtrim(str(p_name)))

不太清楚。你是说
trim()
中没有括号吗?如果没有,那么您只需要
return re.sub(r'\btrim\([^()]*)\)、r'ltrim(rtrim(\1))、text)
Regex不适合解析算术表达式之类的东西,因为在这些表达式中可以嵌套()之类的东西,或者使用嵌套的XML<>——使用正确的解析器更可能成功。@WiktorStribiżew有时在。示例trim(str(p_name))@WiktorStribiż当parethesis中只有一个单词时,请查看您的正则表达式,这很好,已经是一个改进,非常感谢,但是当有嵌套()时,这就是什么都没有发生的地方,这就是我正在努力解决的问题。
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