到目前为止,这仍然不是完全解决方案。仅适用于前面的重复结束字符(例如
))
,]]
,}}
)。我仍在寻找一种捕获随附内容的方法,并将对此进行更新。
代码:
>>> import re
>>> re.search(r'(\(.+?[?<!)]\))', '((x(y)z))', re.DOTALL).groups()
('((x(y)z))',)
详细信息:
r'(\(.+?[?<!)]\))'
()
-捕获组特殊字符。\(
和\)
-开头和结尾字符(例如'
,"
,()
,{}
,{{1} })[]
-匹配任意个字符内容(与.+?
标志一起使用)re.DOTALL
-字符[?<!)]
的负向后查找(将其替换为匹配的结束字符)。基本上可以找到任何)
字符不位于其后的)
字符(更多信息here)。 我正在尝试为我正在使用的这个词法分析器解析类似变量赋值语句的内容,只是试图获得解释器/编译器的基本逻辑。
这是我要处理的基本赋值语句和文字:
\)
以某种方式,我设法解析了诸如 az = none
az_ = true
az09 = false
az09_ = +0.9
az_09 = 'az09_'
_az09 = "az09_"
_az = [
"az",
0.9
]
_09 = {
0: az
1: 0.9
}
_ = (
true
)
,none
,true
和数字文字之类的简单分配。这是我目前停留的位置:
false
我一直在寻找一种用引号,方括号,大括号和括号括起来的值的方法。
如果我找到答案,可能会更新此帖子。
答案 0 :(得分:1)
为每个匹配对使用正则表达式,其中包含多个替代项。
re.match(r'\'.*?\'|".*?"|\(.*?\)|\[.*?\]|\{.*?\}', s)
但是请注意,如果有嵌套的括号,它将与第一个结尾的括号匹配,例如如果输入是
(words (and some more words))
结果将是
(words (and some more words)
正则表达式不适用于匹配嵌套结构,您应该使用更强大的解析技术。
答案 1 :(得分:0)
使用regex
第三方模块解决@Barmar的递归字符:
pip install regex
python3
>>> import regex
>>> recurParentheses = regex.compile(r'[(](?:[^()]|(?R))*[)]')
>>> recurParentheses.findall('(z(x(y)z)x) ((x)(y)(z))')
['(z(x(y)z)x)', '((x)(y)(z))']
>>> recurCurlyBraces = regex.compile(r'[{](?:[^{}]|(?R))*[}]')
>>> recurCurlyBraces.findall('{z{x{y}z}x} {{x}{y}{z}}')
['{z{x{y}z}x}', '{{x}{y}{z}}']
>>> recurSquareBrackets = regex.compile(r'[[](?:[^][]|(?R))*[]]')
>>> recurSquareBrackets.findall('[z[x[y]z]x] [[x][y][z]]')
['[z[x[y]z]x]', '[[x][y][z]]']
对于字符串文字递归,我建议看看this。