简单正则表达式不起作用

2024-06-16 11:01:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将字符串与正则表达式匹配,但它不起作用。你知道吗

我想做的很简单,这是一个典型的情况,当一个用户入侵一系列的页面,或单页。我正在读字符串并检查它是否正确。你知道吗

我所期望的表达式,对于一系列的页面来说是: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的内容,表达式将被识别为良好。你知道吗


Tags: 字符串用户re内容表达式单页情况页面
2条回答

越简单越好

匹配整个输入并不是简单的,正如建议的解决方案所显示的那样,至少它没有它可能/应该那么简单。很快就会变成只读,可能会被任何不懂regex的人抛弃,因为他们需要用更简单更明确的解决方案来修改它。你知道吗

最简单的

首先将整个字符串和.split(",");解析为单独的数据项,您仍然需要这些数据项来处理。无论如何,你必须这样做才能解析出有用的数字。你知道吗

然后测试就变成了一个非常简单的测试。你知道吗

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

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

这使您的逻辑尽可能简单和可维护。您还可以准确地知道输入的哪些部分出错以及为什么出错,这样您就可以向用户报告。你知道吗

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

这个正则表达式应该可以-

^(?:(\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

相关问题 更多 >