2015-10-15 69 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) 
相關問題