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

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

我认为这就是你想要的:https://docs.python.org/2/howto/regex.html#greedy-versus-non-greedy - Jonas
谢谢。现在它只选择单个路径。 - Sriram
如果你想找到所有路径,请查看我的答案,@Sriram,使用re.findall()。 - Jonas
3个回答

8

使用 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']

太好了!如果您的问题已经解决,请接受答案以关闭问题。@Sriram - Jonas
文件并不总是有扩展名的,为了捕获没有扩展名的文件,您可以使用r'(/[^\s\n]+)+'。 - Gal Shahar

5
你的正则表达式(\/.*\.[\w:]+)使用了贪婪模式的.*,会匹配在file2.txt最后一个点之后的[\w:]+。你可以使用非贪婪模式的.*?代替。
但这样也会匹配/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']

演示


3
你可以使用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

该文档介绍了如何使用Python中的re模块查找所有副词。使用re.findall()函数,可以通过正则表达式匹配副词并返回一个列表。在本文档中,提供了匹配英语副词的示例代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接