我正在做一个“解析器”,它必须用另一个关键字替换一个关键字
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/