首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单正则表达式无效

简单正则表达式无效
EN

Stack Overflow用户
提问于 2014-03-14 14:44:33
回答 2查看 96关注 0票数 1

我正在尝试将字符串与正则表达式匹配,但它不起作用。

我试图做的事情很简单,这是典型的情况,当一个用户输入一系列的页面,或单一的页面。我正在读字符串并检查它是否正确。

我期待的表达式,因为页面范围如下:1-3, 5-6, 12-67

我期待的表达式,因为单个页面类似于:1,5,6,9,10,12

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

代码语言:javascript
复制
pagesOption1 = re.compile(r'\b\d\-\d{1,10}\b')
pagesOption2 = re.compile(r'\b\d\,{1,10}\b')

似乎第一个表达式有效,但第二个表达式不起作用。

那么,是否有可能将它们合并到一个正则表达式中呢?如果用户引入类似于1-2, 7-103,5,6,7的东西,那么表达式就会被识别为很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-14 15:05:44

这个大政方针应该有效-

代码语言:javascript
复制
^(?:(\d+\-\d+)|(\d+))(?:\,[ ]*(?:(\d+\-\d+)|(\d+)))*$

演示这里

测试这个-

代码语言:javascript
复制
>>> 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
票数 2
EN

Stack Overflow用户

发布于 2014-03-14 15:14:03

越简单越好

正如建议的解决方案所显示的那样,匹配整个输入并不简单,至少它并不像它所能/应该的那样简单。只会很快读到,当需要使用更简单、更显式的解决方案修改它时,任何不懂regex的人都可能会放弃。

最简单

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

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

代码语言:javascript
复制
^(\d+)(?:-\(d+))?$

它说,在那里,字符串必须以one or more digits开头,后面跟着optionally a single - and one or more digits,然后字符串必须结束。

这使得您的逻辑尽可能简单和可维护。您还可以知道输入的哪一部分是错误的,以及为什么,所以您可以将其报告给用户。

捕获组的存在是因为您需要解析的输入才能实际使用它,这样您就可以获得匹配的数字,而不必添加更多代码来再次解析它们。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22408217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档