我真的停留在正則表達式上。例如,我有: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,我誤解了這個問題。這很有道理。 –