用于查找文件路径的正则表达式

时间:2018-05-31 06:38:18

标签: python regex

我使用此regex(\/.*\.[\w:]+)来查找所有文件路径和目录。但是在像"file path /log/file.txt some lines /log/var/file2.txt"这样的行中,它在同一行中包含两个路径,它不会单独选择路径,而是选择整行。怎么解决这个问题?

3 个答案:

答案 0 :(得分:3)

使用regex(\/.*?\.[\w:]+)使正则表达式非贪婪。如果要在同一行中找到多个匹配项,可以使用re.findall()。

更新: 使用此代码和提供的示例,我得到:

import re
re.findall(r'(\/.*?\.[\w:]+)', "file path /log/file.txt some lines /log/var/file2.txt")
['/log/file.txt', '/log/var/file2.txt']

答案 1 :(得分:1)

您的正则表达式(\/.*\.[\w:]+)使用.*这是贪婪的,并且会在[\w:]+的最后一个点后匹配file2.txt。您可以改为使用.*?

但它也会匹配/log////var////.txt

作为替代方案,您可以使用与目录结构(?:/[^/]+)+?匹配的重复非贪婪模式,后跟与文件名/\w+\.\w+匹配的部分

(?:/[^/]+)+?/\w+\.\w+

import re
s = "file path /log/file.txt some lines /log/var/file2.txt or /log////var////.txt"
print(re.findall(r'(?:/[^/]+)+?/\w+\.\w+', s))

这将导致:

['/log/file.txt', '/log/var/file2.txt']

Demo

答案 2 :(得分:1)

您可以使用python re

类似的东西:

import re
msg="file path /log/file.txt some lines /log/var/file2.txt"
matches = re.findall("(/[a-zA-Z\./]*[\s]?)", msg)
print(matches)

参考:https://docs.python.org/2/library/re.html#finding-all-adverbs