我想创建一个匹配任何这些值的正则表达式
7-5
6-6((0-99) - (0-99))
6-4
6-3
6-2
6-1
6-0
0-6
1-6
2-6
3-6
4-6
6-6示例是一个特例,这里有一些值的例子:
6-6(23-8)
6-6(4-25)
6-6(56-34)
是否可以制作一个可以执行此操作的正则表达式?
如果是这样,是否可以进一步扩展6-6特殊情况下的正则表达式,使括号内两个数字之间的差值等于2或-2?
我可以用程序代码轻松编写这个,但我真的好奇是否有人可以为此设计一个正则表达式。
最后,如果可以进一步扩展以使各个数字在他们自己的匹配组中,我会感到惊讶。一个例子是7-5,我可以有一个匹配组,其值为7,另一个具有值5.但是对于6-6(24-26),我想要一个具有前六个,第二个6的匹配组,24的匹配组和26的匹配组。
这可能是不可能的,但你们中的一些人可能会在那里获得这一部分。
祝你好运,感谢你的帮助。答案 0 :(得分:1)
你可以这样做:
7-5|6-[0-4]|[0-5]-6|6-6 \(\d\d?-\d\d?\)
只需添加父母即可获得匹配组。
答案 1 :(得分:1)
没有。答案是“我们做不到”,原因是因为你试图用锤子挖洞。
写一个长“聪明”的问题(这个词引起了许多人的反叛反应,他们的抗正则性比我更强)正则表达式是,从现在开始的六个月,你会忘记那些聪明的人正如你所使用的正则表达式功能,你将编写与其他东西相关的六个月的代码,你将回到你令人印象深刻的正则表达式并且必须调整一个细节,你会说,“WTF? “
这就是我想要的,在Perl:
# data is in $_
if(/7-5|6-[0-4]|[0-4]-6|6-6 \((\d{1,2})-(\d{1,2})\)/) {
if($1 and $2 and abs($1 - $2) == 2) {
# we have the right difference
}
}
有些人可能会说给定的正则表达式有点多,但我不认为这太糟糕了。如果\d{1,2}
位有点过于模糊,你可以使用\d\d?
(这是我最初使用的,但不喜欢重复)。
答案 2 :(得分:0)
脱离我的头顶(可能有一些错误,但原则应该是好的):
\ d- \ d | 6-6(\ d + - \ d +)
与任何正则表达式一样,您可以用匹配组的括号括起您想要提取的内容:
(\ d) - (\ d)|(6) - (6)((\ d)+ - (\ d +))
在6-6的情况下,前两个括号应该得到六个,而后两个应该得到随后出现的多位数值。
答案 3 :(得分:0)
这是一个只匹配你想要的数字,让你按名称得到每个数字:
p = r'(?P<a>[0-4]|6|7)-(?P<b>[0-4]|6|5) *(\((?P<c>\d{1,2})-(?P<d>\d{1,2})\))?'
要获得您可以使用的每个数字:
values = re.search(p, string).group('a', 'b', 'c', 'd')
将返回包含您要查找的值的四元素元组(如果未找到匹配项,则返回None
。)
这种模式的一个问题是它将修补括号中的内容,无论是否与'6-6'匹配。如果匹配6-6,这个只匹配最后的括号:
p = r'(?P<a>[0-4]|(?P<tmp_a>6)|7)-(?P<b>(?(tmp_a)(?P<tmp_b>6)|([0-4]|5)))(?(tmp_b) *(\((?P<c>\d{1,2})-(?P<d>\d{1,2})\))?)'
我不知道有什么方法可以找出括号中数字之间的差异;正则表达式只知道字符串,而不是数值。 。 。
(我在这里假设python语法; perl语法略有不同,尽管perl支持python的处理方式。)