【问题标题】:Regex group match exactly n times正则表达式组完全匹配 n 次
【发布时间】:2014-08-15 11:10:10
【问题描述】:

我必须验证下一个字符串格式:

text-text-id-text

分隔符是字符'-'。第三列必须始终是 id。我写了下一个验证字符串的正则表达式(在python中):

import re

s = 'col1-col2-col3-id' # any additional text at the end
                        # is allowed e.g. -col4-col5
print re.match('^(.*-){3}id(-.*)?$', s) # ok 
print re.match('^(.*-){1}id(-.*)?$', s) # still ok, is should not be

我尝试添加非贪婪模式,但结果还是一样:

^(.*?-){1}id(-.*)?$

我的正则表达式中缺少什么?我可以像这样验证字符串:

>>> import re
>>> print re.split('-', 'col1-col2-col3-id')
['col1', 'col2', 'col3', 'id']

然后检查第三个元素是否匹配 id,但我感兴趣的是为什么第一个正则表达式会像上面提到的那样工作。

【问题讨论】:

    标签: python regex string


    【解决方案1】:

    您的第一个正则表达式不正确,因为它断言 id 存在于在前三个项目之后
    您的第二个正则表达式不正确地匹配字符串,因为 .* 也匹配连字符。

    你应该使用这个正则表达式:

    /^(?:[^-]+-){2}id/
    

    这是regex demo

    如果您觉得需要将正则表达式锚定到末尾,请使用/^(?:[^-]*-){2}id.*$/


    Tim Pietzcker 所述,考虑在项目末尾声明id

    /^(?:[^-]+-){2}id(?![^-])/
    

    这是UPDATED regex demo

    【讨论】:

    • +1,并且可能在id 之后使用前瞻断言(?=-|$) 以确保第三列不像idiom
    • 可能,但我们不知道-s 之间允许哪些字符,也许id.txt 是有效的,不应该匹配。
    • @georg 任何其他列也可以是 id。有效字符串也是 id-id-id-id。然后我进一步验证列 id 的行。我检查空格。
    • @Unihedron .* 也匹配连字符。谢谢。 ?: 有必要吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    相关资源
    最近更新 更多