2015-10-15 46 views
2

我真的停留在正则表达式上。例如,我有:Python:允许重复正则表达式,只允许在逗号之间使用1连字符

^(\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

回答

1

注意\d+匹配一个数字以上的字符串。如果您只需要单个数字,请将\d+替换为\d

我原来的一个是基于对这个问题的曲解。

尝试

^(\d+)(?:(?:[,/](\d+))*?[-,](\d+)(?:[,/](\d+))*?)$ 

这可能会改变,你觉得如果这是对你很重要的群体的numberings。

此外,它允许你用你的原始正则表达式替换你的一些斜杠。我不确定这是否是你的意图。

+0

优秀!我会upvote,但我没有足够的代表 – markmartian

+0

不符合''4-4,5-6,3,4,7-1000,43,55-140'';) – metatoaster

+0

Ooooh,我误解了这个问题。这很有道理。 –

1

你可以通过简单地将它们分解成独立的单元,也就是一个数字或范围,这是由(\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> 
2

假设,/是有效令牌分隔符:

的Regex

^(?:(?:^|[/,])\d+(?:-\d+)?)+$ 
  • (?:^|[/,])匹配字符串的beggining,或者需要一个令牌定界符。
  • \d+匹配任何正整数。
  • (?:-\d+)?允许使用可选的连字符和整数。
  • 全部内容都包含在(?: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) 
相关问题