[nn.nn] vs [nn]的正则表达式,具有更正的分组

时间:2014-05-22 12:34:36

标签: python regex

我正在尝试构建一个regexp来处理以字符串形式呈现给我的数据类型, 有两种可能的格式:

  1. 串[nmin..nmax]
  2. 串[n最大]
  3. 其中nmin和nmax是一些数字。

    我构建了适合我的正则表达式,但我想找到一种更好的方法

    \[(\d+)(\.{2})?(\d+)?\] 
    

    我不喜欢:

    1. 我把点放在不同的组中,但我不需要他们作为一个小组。

    2. nmax始终存在,但根据模式,它将在第1组或第3组中。我有办法总是将它放在同一组中吗?

3 个答案:

答案 0 :(得分:3)

您可以在Python中使用非捕获组作为点:\[(\d+)??(?:\.{2})?(\d+)\]

对于nminnmax,您可以使用命名组来解决第二个问题。

答案 1 :(得分:3)

如果您希望nmax始终位于同一群组中,则可以使用

\[(?:(\d+)\.{2})?(\d+)]

(?:...)是非捕获组,我们使用它来制作nmin..匹配构造(\d+)\.{2},可选。

但即使它是可选的,捕获组索引也会增加:nmax将始终位于组2中,nmin(如果存在)始终位于组1中。请参阅demo here

答案 2 :(得分:0)

你想要的正则表达式是:

>>> import re
>>> r = re.compile(r'\w+\[(?P=min\d+)(?:\.\.(?P=max\d+))?\]')
>>> r.match('aaa[12]').groups()
(u'12', None)
>>> r.match('aaa[12..13]').groups()
(u'12', u'13')

这里是匹配正则表达式的NFA

Regular expression visualization

这里是NFA匹配你的正则表达式:

Regular expression visualization

与您所说的内容不匹配,因为您没有匹配括号前面的字符串部分。因此,它仅匹配[12][13..14],但不匹配xxx[12]aaa[13..14]

最后,这是一个使用捕获组的示例:

>>> r = re.compile(r'\w+\[(?P<nmin>\d+)(?:\.\.(?P<nmax>\d+))?\]')
>>> r.match('aoeu[12]').groupdict()
{'nmax': None, 'nmin': '12'}
>>> r.match('aoeu[12..13]').groupdict()
{'nmax': '13', 'nmin': '12'}