【问题标题】:Python regex match url without file extensionPython正则表达式匹配没有文件扩展名的url
【发布时间】:2025-11-22 05:05:03
【问题描述】:

我正在尝试创建一个匹配不以文件扩展名结尾的相对 url 的正则表达式。为简单起见省略带有目录的 url,我期望以下内容:

Url to match Expected result
/foo match
/foo. match
/foo.bar no match

我目前正在尝试正则表达式'(/[a-zA-Z]+)*/([a-zA-Z]+)(?!\.[a-zA-z]+).*?'。这匹配“/foo”和“/foo”。正如预期的那样。但是,它也匹配“/foo.bar”。 regex.match('/foo.bar') 返回<re.Match object; span=(0, 3), match='/fo'>。如果字符串以文件扩展名结尾,则负前瞻似乎不是不匹配,而是从应该是前一组的字符中获取一个字符。

我如何完成我想要完成的事情?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    尝试添加$(?:\.)?

    >>> re.match('(/[a-zA-Z]+)*/([a-zA-Z]+)(?!\.[a-zA-z]+)(?:\.)?$', '/foo.bar') # No match
    >>> re.match('(/[a-zA-Z]+)*/([a-zA-Z]+)(?!\.[a-zA-z]+)(?:\.)?$', '/foo.')
    <re.Match object; span=(0, 5), match='/foo.'>
    >>> 
    

    【讨论】:

    • 那行得通。如果您不介意我问, (?:) 是什么意思?我知道 (?=) 是正前瞻, (?!) 是负前瞻,但我以前从未见过。
    • @AnthonyBias Ah, (?:) 表示匹配或不匹配,查看更多信息:Regex to match "www" or nothing
    • @U12-Forward (?:) 并不意味着“匹配或不匹配”。 (这就是尾随 ? 在关闭 ) 之后所做的事情)。 (?:) 是一个 non-capturing 组,而不仅仅是一个带括号的子模式,它是一个 capturing 组。但是在这个例子中,group 无论如何都是多余的,因为它只包含一个字符。 (?:\.)?\.? 相同。
    【解决方案2】:

    如果您的唯一目标是将 URL 映射到模式,则可以使用 fullmatch() 而不使用前瞻和捕获组:

    import re
    
    for txt in ['/foo', '/foo.', '/foo.bar']:
        r = re.fullmatch('(?:/[a-zA-Z]+)*/[a-zA-Z]+\.?', txt)
        print(txt,'match' if r else 'no match')
    

    打印:

    /foo match
    /foo. match
    /foo.bar no match
    
    

    【讨论】:

      最近更新 更多