我正在尝试构建一个regexp来处理以字符串形式呈现给我的数据类型, 有两种可能的格式:
其中nmin和nmax是一些数字。
我构建了适合我的正则表达式,但我想找到一种更好的方法
\[(\d+)(\.{2})?(\d+)?\]
我不喜欢:
我把点放在不同的组中,但我不需要他们作为一个小组。
nmax始终存在,但根据模式,它将在第1组或第3组中。我有办法总是将它放在同一组中吗?
答案 0 :(得分:3)
您可以在Python中使用非捕获组作为点:\[(\d+)??(?:\.{2})?(\d+)\]
。
对于nmin
和nmax
,您可以使用命名组来解决第二个问题。
答案 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:
这里是NFA匹配你的正则表达式:
与您所说的内容不匹配,因为您没有匹配括号前面的字符串部分。因此,它仅匹配[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'}