我想要匹配位于多个目录中的文件:
文件路径可以在本地 - C:/users/path/image.png 或在系统上 - / /home/user/web/image.png
对于第一种情况,我有正则表达式 -
[c|C]:[^.]+[.][A-Za-z]{3}
如何使用单个正则表达式来匹配这两种情况?
答案 0 :(得分:2)
尝试
((c|C|//home)[^.]+[.][A-Za-z]{3})
如果您想使用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}
。