首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:允许重复正则表达式,但逗号之间只允许1个连字符

Python:允许重复正则表达式,但逗号之间只允许1个连字符
EN

Stack Overflow用户
提问于 2015-10-15 10:03:42
回答 2查看 75关注 0票数 2

我真的被正则表达式卡住了。例如,我有:

代码语言:javascript
运行
复制
^(\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

EN

回答 2

Stack Overflow用户

发布于 2015-10-15 10:20:21

假设,/是有效的令牌分隔符:

正则表达式

代码语言:javascript
运行
复制
^(?:(?:^|[/,])\d+(?:-\d+)?)+$

  • (?:^|[/,])在字符串的乞求处匹配,或者需要令牌delimiter.
  • \d+匹配任何正的integer.
  • (?:-\d+)?允许可选的连字符,并且integer.
  • This都包含在(?:non-capturing group)中,以便用+重复(至少一次)。

代码

代码语言:javascript
运行
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2015-10-15 10:20:21

您可以简单地通过将它们分解为独立的单元来澄清您的模式,即,将它们分解成由(\d+(?:-\d+)?)表示的数字或范围,并在前面使用逗号再次重复该模式,然后进行*匹配,结果如下所示

代码语言:javascript
运行
复制
^(\d+(?:-\d+)?)(?:,(\d+(?:-\d+)?))*$

python中的示例用法。

代码语言:javascript
运行
复制
>>> 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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33138609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档