python中的递归正则表达式模式匹配

时间:2016-02-09 00:25:38

标签: python regex recursion

我试图在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:意外结束模式"

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 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.matchre.search进行验证。