简单的正则表达式无效

时间:2014-03-14 14:44:34

标签: python regex

我正在尝试将字符串与正则表达式匹配,但它无效。

我想要做的很简单,这是用户介入一系列页面或单页时的典型情况。我正在读取字符串并检查它是否正确。

我期待的表达式,对于一系列页面,如:1-3, 5-6, 12-67

我期待的表达式,对于单个页面,如:1,5,6,9,10,12

这是我到目前为止所做的:

pagesOption1 = re.compile(r'\b\d\-\d{1,10}\b')
pagesOption2 = re.compile(r'\b\d\,{1,10}\b')

似乎第一个表达式有效,但不是第二个。

并且,是否可以将它们合并在一个正则表达式中?以某种方式,如果用户引入类似1-2, 7-10之类的内容或类似3,5,6,7之类的内容,则表达式将是被认为是好的。

2 个答案:

答案 0 :(得分:3)

更简单

匹配整个输入并不是简单,正如所提出的解决方案所示,至少它并不像它应该/应该那样简单。将非常快速地成为只读,并且当他们需要使用更简单更明确的解决方案修改它时,可能会被那些不是正则表达式的人所取消。

最简单

首先将整个字符串和.split(",");解析为单个数据条目,无论如何都需要处理它们。无论如何,你必须这样做才能解析出可用的数字。

然后测试变得非常简单,测试。

^(\d+)(?:-\(d+))?$

它说,字符串必须以one or more digits开头,然后是optionally a single - and one or more digits,然后字符串必须结束。

这使您的逻辑尽可能简单和可维护。您还可以准确了解输入的哪个部分是错误的,为什么这样您可以将其报告给用户。

捕获组是存在的,因为无论如何你需要解析出的输入实际使用它,这样你就可以获得匹配的数字,而无需添加更多代码来解析它们。

答案 1 :(得分:2)

这个正则表达式应该有效 -

^(?:(\d+\-\d+)|(\d+))(?:\,[ ]*(?:(\d+\-\d+)|(\d+)))*$

演示here

测试这个 -

>>> test_vals = [
            '1-3, 5-6, 12-67',
            '1,5,6,9,10,12',
            '1-3,1,2,4',
            'abcd',
        ]
>>> regex = re.compile(r'^(?:(\d+\-\d+)|(\d+))(?:\,[ ]*(?:(\d+\-\d+)|(\d+)))*$')
>>> for val in test_vals:
    print val
    if regex.match(val) == None:
        print "Fail"
    else:
        print "Pass"


1-3, 5-6, 12-67
Pass
1,5,6,9,10,12
Pass
1-3,1,2,4.5
Fail
abcd
Fail