我正在尝试将字符串与正则表达式匹配,但它不起作用。
我试图做的事情很简单,这是典型的情况,当一个用户输入一系列的页面,或单一的页面。我正在读字符串并检查它是否正确。
我期待的表达式,因为页面范围如下: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的东西,那么表达式就会被识别为很好。
发布于 2014-03-14 15:05:44
这个大政方针应该有效-
^(?:(\d+\-\d+)|(\d+))(?:\,[ ]*(?:(\d+\-\d+)|(\d+)))*$演示这里
测试这个-
>>> 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发布于 2014-03-14 15:14:03
越简单越好
正如建议的解决方案所显示的那样,匹配整个输入并不简单,至少它并不像它所能/应该的那样简单。只会很快读到,当需要使用更简单、更显式的解决方案修改它时,任何不懂regex的人都可能会放弃。
最简单
首先将整个字符串和.split(",");解析为单独的数据条目,无论如何,您将需要处理这些条目。无论如何,您必须这样做才能解析出可用的数字。
然后测试变得非常简单,测试。
^(\d+)(?:-\(d+))?$它说,在那里,字符串必须以one or more digits开头,后面跟着optionally a single - and one or more digits,然后字符串必须结束。
这使得您的逻辑尽可能简单和可维护。您还可以知道输入的哪一部分是错误的,以及为什么,所以您可以将其报告给用户。
捕获组的存在是因为您需要解析的输入才能实际使用它,这样您就可以获得匹配的数字,而不必添加更多代码来再次解析它们。
https://stackoverflow.com/questions/22408217
复制相似问题