Python:允许重复正则表达式,但逗号之间仅允许1个连字符
我真的很喜欢正则表达式。例如,我有:Python:允许重复正则表达式,但逗号之间仅允许1个连字符,python,regex,Python,Regex,我真的很喜欢正则表达式。例如,我有: ^(\d+)(?:[-,](\d+)(?:[,/](\d+))*?)*$ 这允许我重复匹配0-9之间的任何逗号删除数字。 即4,5,6,6,7,8,8==match但是,它也允许在逗号之间用连字符多次分隔数字,这是我不希望看到的。 即4-4-4-4-4,4,4-4==匹配 如何更改此模式,以允许: 4-4,5,5 但不是4-4-4-4注意\d+匹配一个或多个数字的字符串。如果只需要单个数字,请将\d+替换为\d 我最初的解释是基于对这个问题的误解 试一试
^(\d+)(?:[-,](\d+)(?:[,/](\d+))*?)*$
这允许我重复匹配0-9之间的任何逗号删除数字。
即4,5,6,6,7,8,8==match
但是,它也允许在逗号之间用连字符多次分隔数字,这是我不希望看到的。
即4-4-4-4-4,4,4-4==匹配
如何更改此模式,以允许:
4-4,5,5
但不是
4-4-4-4
注意\d+
匹配一个或多个数字的字符串。如果只需要单个数字,请将\d+
替换为\d
我最初的解释是基于对这个问题的误解
试一试
这可能会改变您发现的组的编号,如果这对您很重要的话
此外,它允许您使用逗号替换某些斜杠,就像原始正则表达式一样。我不确定这是否是您的意图。您可以简单地通过将模式分解为独立的单元来澄清您的模式,即数字或范围,由
(\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>
>>patt=re.compile(r'^(\d+(?:-\d+)?(:,(\d+(?:-\d+))))*$)
>>>部分搜索('4,5')
>>>部分搜索('4-4')
>>>patt.search('4-4-4-4')
>>>部分搜索('4-4,5-6,3,4,7-1000,43,55-140')
假设、
和/
是有效的令牌分隔符:
Regex
^(?:(?:^|[/,])\d+(?:-\d+)?)+$
在字符串的开头匹配,或者需要标记分隔符(?:^ |[/,])
匹配任何正整数\d+
允许可选的连字符和整数(?:-\d+)
- 这些都包含在
中,以便在(?:非捕获组)
中重复(至少一次)+
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)
不匹配
'4-4,5-6,3,4,7-1000,43,55-140'
;)哦,我误解了这个问题。这很有道理。
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)