创建最短的正则表达式

时间:2011-03-02 02:14:49

标签: regex

我想创建一个匹配任何这些值的正则表达式

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的匹配组。

这可能是不可能的,但你们中的一些人可能会在那里获得这一部分。

祝你好运,感谢你的帮助。

4 个答案:

答案 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的处理方式。)