如何编写正则表达式以匹配多个文件路径

时间:2013-12-04 22:03:01

标签: python regex

我想要匹配位于多个目录中的文件:

文件路径可以在本地 - C:/users/path/image.png 或在系统上 - / /home/user/web/image.png

对于第一种情况,我有正则表达式 -

[c|C]:[^.]+[.][A-Za-z]{3}

如何使用单个正则表达式来匹配这两种情况?

2 个答案:

答案 0 :(得分:2)

尝试

((c|C|//home)[^.]+[.][A-Za-z]{3})

Regular expression visualization

Debuggex Demo

如果您想使用findall(),则所有匹配都将显示在元组列表中。元组包含正则表达式中的组,这就是上面的正则表达式的关键 - 整个表达式必须是一个组本身才能显示在findall()的返回值中。请参阅以下代码

smth = "//home/user/web/image.png C:/users/path/image.png c:/web/image.png"
ip = re.findall("((c|C|//home)[^.]+[.][A-Za-z]{3})",smth)
print ip
[('//home/user/web/image.png', '//home'), ('C:/users/path/image.png', 'C'), ('c:/web/image.png', 'c')]

答案 1 :(得分:2)

你想从比赛中得到什么还不清楚 - 也许你只想要完整的字符串?

((?:(?:[cC]:)|//home)[^\.]+\.[A-Za-z]{3})

点(.)将匹配(接近)所有内容。如果您想与字符串.进行比较和对比,则应使用\.对其进行转义。

测试运行:

>>> print re.match("((?:(?:[cC]:)|//home)[^\.]+\.[A-Za-z]{3})", "//home/user/web/image.png").groups()
('//home/user/web/image.png',)

>>> print re.match("((?:(?:[cC]:)|//home)[^\.]+\.[A-Za-z]{3})", "C:/users/path/image.png").groups()
('C:/users/path/image.png',)

一个用于通常的Windows路径语法:

>>> print re.match("((?:(?:[cC]:)|//home)[^\.]+\.[A-Za-z]{3})", "C:\users\path\image.png").groups()
('C:\\users\\path\\image.png',)

如果需要支持.jpeg,请将附加信息的最大允许出现次数从{3}增加到{3,4}