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))
您无法将递归模式与内置Pythonre
匹配,因此您必须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