我正在尝试将字符串与正则表达式匹配,但它无效。
我想要做的很简单,这是用户介入一系列页面或单页时的典型情况。我正在读取字符串并检查它是否正确。
我期待的表达式,对于一系列页面,如: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
之类的内容,则表达式将是被认为是好的。
答案 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