我真的被正则表达式卡住了。例如,我有:
^(\d+)(?:[-,](\d+)(?:[,/](\d+))*?)*$
这允许我重复匹配从0到9的任何逗号分隔的数字。i.e 4,5,6,6,7,8,8 == match
但是,它还允许在逗号之间用连字符多次分隔数字,这是我不想要的。i.e 4-4-4-4-4,4,4-4 == match
如何更改此模式,使其允许:4-4,5,5
而不是4-4-4-4
发布于 2015-10-15 10:20:21
假设,
和/
是有效的令牌分隔符:
正则表达式
^(?:(?:^|[/,])\d+(?:-\d+)?)+$
(?:^|[/,])
在字符串的乞求处匹配,或者需要令牌delimiter.\d+
匹配任何正的integer.(?:-\d+)?
允许可选的连字符,并且integer.(?:non-capturing group)
中,以便用+
重复(至少一次)。代码
import re
pattern = re.compile(r'^(?:(?:^|[/,])\d+(?:-\d+)?)+$')
text = "4,4-5,6,6,7,8,9-8,1234-1,4321"
re.search(pattern, text)
发布于 2015-10-15 10:20:21
您可以简单地通过将它们分解为独立的单元来澄清您的模式,即,将它们分解成由(\d+(?:-\d+)?)
表示的数字或范围,并在前面使用逗号再次重复该模式,然后进行*
匹配,结果如下所示
^(\d+(?:-\d+)?)(?:,(\d+(?:-\d+)?))*$
python中的示例用法。
>>> patt = re.compile(r'^(\d+(?:-\d+)?)(?:,(\d+(?:-\d+)?))*$')
>>> patt.search('4,5')
<_sre.SRE_Match object at 0x7fba38759360>
>>> patt.search('4-4')
<_sre.SRE_Match object at 0x7fba387593e8>
>>> patt.search('4-4-4-4')
>>> patt.search('4-4,5-6,3,4,7-1000,43,55-140')
<_sre.SRE_Match object at 0x7fba38759360>
https://stackoverflow.com/questions/33138609
复制相似问题