我试图在python中匹配递归模式,但我错过了一些东西并且收到了错误。
我想实现:
var = [a-z]+
digit = [0-9]+
op=+,-,*,/
E->var|digit|op E E
例如:
"+ x 1",
"* x * y + x y"
这是我的代码:
import re
term="[a-z]+|[0-9]+"
op=[+-/*]
exp="("+term+"|("+op+" "+term+" "+term+")|(?R))
当我re.match(exp,"+ x 1")
播种时,我得到了:
" sre_constants.error:意外结束模式"
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
我建议使用内置re
的非递归正则表达式:
^[+/*-] ?(?:[a-z]+|[0-9]+)(?: ?(?:[a-z]+|[0-9]+))?(?: [+/*-] ?(?:[a-z]+|[0-9]+)(?: ?(?:[a-z]+|[0-9]+))?)*$
请参见regex demo
该模式遵循特定的方案:^block{{op} ?{term}(?: ?{term})?}(?: {block})*$
。
详细信息
^
-字符串的开头[+/*-] ?(?:[a-z]+|[0-9]+)(?: ?(?:[a-z]+|[0-9]+))?
-阻止部分:
[+/*-]
- op :+
,/
,*
或-
\?
-可选空格(?:[a-z]+|[0-9]+)
-条款部分:1个以上的小写字母或1个以上的数字(?: ?(?:[a-z]+|[0-9]+))?
-可选序列: \?
-可选空格(?:[a-z]+|[0-9]+)
-“期限”模式(\?:
-非捕获组的开始和一个空格
[+/*-] ?(?:[a-z]+|[0-9]+)(?: ?(?:[a-z]+|[0-9]+))?
-“阻止”模式)*
-非捕获组的结尾,重复0次或更多次$
-字符串的结尾。在Python中:
op = r'[+/*-]'
term = r'(?:[a-z]+|[0-9]+)'
block = rf'{op} ?{term}(?: ?{term})?'
pattern = rf'^{block}(?: {block})*$'
对模式使用re.match
或re.search
进行验证。