我真的停留在正则表达式上。例如,我有: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
我真的停留在正则表达式上。例如,我有: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
注意\d+
匹配一个数字以上的字符串。如果您只需要单个数字,请将\d+
替换为\d
。
我原来的一个是基于对这个问题的曲解。
尝试
^(\d+)(?:(?:[,/](\d+))*?[-,](\d+)(?:[,/](\d+))*?)$
这可能会改变,你觉得如果这是对你很重要的群体的numberings。
此外,它允许你用你的原始正则表达式替换你的一些斜杠。我不确定这是否是你的意图。
你可以通过简单地将它们分解成独立的单元,也就是一个数字或范围,这是由(\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>
假设,
和/
是有效令牌分隔符:
的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)
优秀!我会upvote,但我没有足够的代表 – markmartian
不符合''4-4,5-6,3,4,7-1000,43,55-140'';) – metatoaster
Ooooh,我误解了这个问题。这很有道理。 –