【问题标题】:RegEx: Comma separated complex groups正则表达式:逗号分隔的复杂组
【发布时间】:2017-09-16 19:14:31
【问题描述】:

假设我有一个逗号分隔的行:

aa,bb,cc

我可以使用正则表达式(不太好,因为这也匹配,aa,但这不是这里的问题):

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

例如

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

现在,假设&lt;my pattern&gt; 非常长且复杂,如果我能说这样的话会很好:

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

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

【问题讨论】:

  • &lt;my pattern&gt; is very long and complex 那么,那又怎样?只需通过(?:[a-zA-Z]+)(?:,?[a-zA-Z])* 复制它因为&lt;your pattern&gt; 没什么特别的,所以没有理由使用递归。仅当您需要平衡文本(可以是任何内容)时才使用递归,因为递归通常会增加相当大的开销。

标签: python regex python-3.x


【解决方案1】:

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

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

【讨论】:

  • 这样的语法糖存在但不在 Python re 模块中。但是,它存在于正则表达式模块中:pypi.python.org/pypi/regex。请注意,此模块还支持重复捕获。使用此功能,您可以同时提取和检查。
  • 它也不是“语法糖”,因为此功能使递归成为可能,并允许像使用词法分析器一样编写模式。
【解决方案2】:

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

但是,正则表达式引擎没有对此的内置支持并不意味着我们无法构建实现目标的正则表达式模式。我们所要做的就是更改正则表达式中的, - 我们希望允许逗号作为字符串的开头,而不是寻找逗号:

((?:,|^)[a-zA-Z]*)*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多