【问题标题】:Regex for numpy's 1D advanced indexing syntax - How to deal with optional trailing commanumpy 的一维高级​​索引语法的正则表达式 - 如何处理可选的尾随逗号
【发布时间】:2019-09-29 01:21:08
【问题描述】:

我正在尝试创建一个正则表达式来匹配一维数组的 Python numpy 高级索引语法的子集。

到目前为止,我有这个:

^[_a-zA-Z]\w*\s*\[\s*\[(\s*[-+]?\s*[1-9][0-9]*\s*,\s*)*\]\s*\]$

此正则表达式可以成功匹配以下内容:

a[[10,]]
a[[+10,-10,20,]]
a [ [ + 10 , - 10 , 20 , ] ]
a[[]]

但是,Python 列表中的尾随逗号是可选的,不是必需的。不幸的是,我的正则表达式无法验证以下内容:

a[[10]]
a[[10,10]]

请注意内括号末尾缺少的逗号。如果我在我的正则表达式模式的, 旁边添加一个?,则上述模式得到验证。但是,正则表达式还会验证不希望的数字表达式项目(例如:a[[10+10,10]])。

我本质上想要的是有一个整数列表,在内方括号中,用逗号分隔并允许尾随逗号。此外,这些号码可以有-+ 前缀。

有人可以为我提供验证上述模式的解决方案吗?

谢谢。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    必须以精确的方式将可选与必需混合在一起。

    ^[_a-zA-Z]\w*\s*\[\s*\[(?:\s*(?:[-+]\s*)?[1-9][0-9]*(?:\s*,\s*(?:[-+]\s*)?[1-9][0-9]*)*(?:\s*,)?\s*)?\]\s*\]$

    https://regex101.com/r/D3wzYb/1

    展开

     ^    
     [_a-zA-Z] 
     \w* \s* \[ \s* \[ 
     (?:
          \s* 
          (?: [-+] \s* )?
          [1-9] [0-9]* 
          (?:
               \s* , \s* 
               (?: [-+] \s* )?
               [1-9] [0-9]* 
          )*
          (?: \s* , )?
          \s* 
     )?
     \] \s* \] 
     $
    

    【讨论】:

      【解决方案2】:

      您可以修改您的正则表达式以允许在结束 ] 之前使用可选数字后跟逗号

      ^[_a-zA-Z]\w*\s*\[\s*\[(\s*[-+]?\s*[1-9][0-9]*\s*,\s*)*(\s*[-+]?\s*[1-9][0-9]*\s*)?\]\s*\]$
      

      Demo on regex101

      【讨论】:

      • 非常感谢您的回复!我喜欢您的解决方案,因为它非常简单易懂。但是,我有点担心这个解决方案包括数字正则表达式的重复(即\s*[-+]?\s*[1-9][0-9]*\s*)。有什么方法可以避免这种重复,但又不会使正则表达式难以阅读(即,没有奇怪的前瞻等)?
      • @AstrOne 是的,重复是不幸的,但是(我很确定)你必须有那个不包含 , 的组来匹配例如a[[10]] as - 正如您所发现的那样 - 使逗号可选允许正则表达式匹配 a[[10+10]]。我确实研究过使用前瞻,但它们并没有真正简化问题。
      • 非常感谢@Nick。我会接受您的回答,因为它既有效又简单。话虽如此,其他两个答案也很棒,我不得不说很有教育意义。
      • @AstrOne 谢谢。我几乎总是发现自己从阅读其他答案中学到了一些东西。
      【解决方案3】:

      也许,

      (?i)(?!.*\d\s*[+*%-]\s*\d)^[a-z_]\w*\s*\[\s*\[(\s*[-+]?\s*[1-9][0-9]*\s*,?\s*)*\]\s*\]$
      

      那时会做。

      Demo

      在这里,我们会使用一些子表达式来使那些不需要的操作失败,例如,

      (?!.*\d\s*[+*%-]\s*\d)
      

      例如,我们会将它包含在表达式的开头。

      【讨论】:

      • 非常感谢您的回复!对此,我真的非常感激。您的解决方案几乎解决了我的问题中描述的问题。我应该解释什么是 numpy 高级索引语法。我现在将编辑我的问题以包含解释。我真正想要的是有一个用逗号分隔的整数列表(在内括号中),并允许在这些数字上添加 -/+ 前缀。不幸的是,您的解决方案错误地验证了:a[[10 10]]。通过用[ +*%-] 替换您的[+*%-],问题得到解决。另外,*% 是必需的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多