2017-09-16 45 views
0

假设我有一个逗号分隔行:正则表达式:逗号分隔的复杂群体

aa,bb,cc 

我可以使用正则表达式这个(没有真正确定,因为这也符合,aa但在这里不是问题):

(<my pattern>)?(,<my pattern>)* 

例如

([a-zA-Z]*)?(,[a-zA-Z]*)* 

现在,假设<my pattern>很长且复杂,这将是很好,如果我可以这样说:

(<my pattern>)?(,<repeat previous/named group>)* 

有没有办法说重复某一组(名称)(在Python 3.5中)

+0

'很长,complex'而, 所以呢?只需通过'(?:[a-zA-Z] +)(?:,?[a-zA-Z])复制它即可。''因为'<你的模式>'没什么特别的,所以没有理由使用递归。只有在需要平衡文本(可以是任何东西)时才使用递归,因为一般的递归会增加相当大的开销。 – sln

回答

0

恐怕这样的语法糖在正则表达式中不存在,但考虑到python使用正则表达式的字符串,您可以简单地使用字符串格式来减少代码:

re.findall('({0})?(,{0})*'.format(<your_pattern>), <some_string>) 
+0

这样的语法糖存在但不在Python re模块中。但是,它存在于正则表达式模块中:https://pypi.python.org/pypi/regex。请注意,该模块还支持重复捕获。借助此功能,您可以同时提取和检查。 –

+0

它不是一个“语法糖”,因为这个特性使得递归成为可能,并且允许像词法分析器那样编写一个模式。 –

0

有支持这种反向引用的正则表达式引擎,但Python的正则表达式引擎不支持。

但是,仅仅因为正则表达式引擎没有内建支持,并不意味着我们不能建立一个实现我们目标的正则表达式模式。我们所要做的就是改变,在正则表达式 - 而不是寻找一个逗号,我们要允许一个逗号字符串的开头:

((?:,|^)[a-zA-Z]*)* 
相关问题