Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:允许重复正则表达式,但逗号之间仅允许1个连字符_Python_Regex - Fatal编程技术网

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)