正则表达式匹配可选文件扩展名

时间:2012-05-31 07:20:05

标签: python regex url python-2.7

我正在使用Python中的正则表达式从文本中提取部分URL。我正在寻找的URL来自一组有限的模式,所以感觉我应该能够在正则表达式中处理它们。我想要提取的是文件名的第一部分(下面所有例子中的“some.file.name”),可以包括点,字母和数字。

这些是URL可以采用的各种形式:

http://www.example.com/some.file.name.html
http://www.example.com/some.file.name_foo.html
http://www.example.com/some.file.name(123).html
http://www.example.com/some.file.name_foo(123).html
http://www.example.com/some.file.name
http://www.example.com/some.file.name_foo
http://www.example.com/some.file.name(123)
http://www.example.com/some.file.name_foo(123)

我认为我在这个正则表达式中非常适合:

http://www\.example\.com/([a-zA-Z0-9\.]+)(_[a-z]+)?(\(\d+\))?(\.html)?

但是当URL与列表中的第一个相同时,它包含匹配中的“.html”。有没有办法阻止这种情况,还是正则表达式的基本限制?

我很高兴删除代码中的扩展名,因为它总是相同的,并且永远不会作为文件名的一部分有效,但在正则表达式匹配中执行它会更清晰。

修改

我应该强调这些网址是文本正文。我不能保证在它们之前或之后是否有字符或这些字符可能是什么。我认为可以安全地假设它们不是数字,字母,下划线或点。

3 个答案:

答案 0 :(得分:2)

默认情况下,正则表达式与贪婪匹配。

试试这个正则表达式:

^http://www\.example\.com/([a-zA-Z0-9\.]+?)(_[a-z]+)?(\(\d+\))?(\.html)?$

请注意,添加的额外?不会捕获第一部分中的.html。它使第一组捕获尽可能少匹配,而不是尽可能匹配。如果没有?.html将包含在第一个组中,因为其他组是可选的,并且贪婪匹配尝试尽可能“早”匹配。

P.S。另请注意,我使用^$来锚定正则表达式以始终匹配整行。

答案 1 :(得分:0)

您可以将.html扩展名指定为非捕获组:

http://www\.example\.com/([a-zA-Z0-9\.]+)(_[a-z]+)?(\(\d+\))?(?=(\.html)?)

答案 2 :(得分:0)

听起来你不关心文件扩展名。您只想提取文件名。

试试这个:

http://www\.example\.com/([\w]+.[\w]+.[\w()]+)

在PHP中,我使用了preg_match_all($ regex,$ str,$ matches),它返回了类似的内容。

Array
(
    [0] => Array
        (
            [0] => http://www.example.com/some.file.name
            [1] => http://www.example.com/some.file.name_foo
            [2] => http://www.example.com/some.file.name(123)
            [3] => http://www.example.com/some.file.name_foo(123)
            [4] => http://www.example.com/some.file.name
            [5] => http://www.example.com/some.file.name_foo
            [6] => http://www.example.com/some.file.name(123)
            [7] => http://www.example.com/some.file.name_foo(123)
        )

    [1] => Array
        (
            [0] => some.file.name
            [1] => some.file.name_foo
            [2] => some.file.name(123)
            [3] => some.file.name_foo(123)
            [4] => some.file.name
            [5] => some.file.name_foo
            [6] => some.file.name(123)
            [7] => some.file.name_foo(123)
        )

)

希望它有所帮助!