从文本中提取文件路径

时间:2019-08-19 21:43:40

标签: python regex

我有一个文本文件,其中包含各种类型的路径和目录以及一些URL。我试图获取不包括URL和Windows目录(c:/)的其他路径。

txt = r'''
\Files\System\ado\

C:\Dir\me\match1\poq!"&\file.txt

http://example/uploads/ssh/

{drive of encrypted files}\FreezedByWizard.README.TXT

%Program Files%\Common Files\System\ado\

/home/user/web/other.longextension
'''

正确的输出:

\Files\System\ado\

{drive of encrypted files}\

%Program Files%\Common Files\System\ado\

/home/user/web/

我尝试了各种正则表达式,包括这些正则表达式,但是我无法获得正确的结果。

pattern = re.compile(r'(?:/[^/]+)*',re.I)
# pattern = re.compile(r'\b(\\.+\\|\/.+\/|\%.+\%)(?:[^\/]|\\\/)+?\b',re.I) 
# this one for example prints all subdirectories not the main one!

matches = re.findall(pattern,txt)
print(matches)

3 个答案:

答案 0 :(得分:5)

我注意到您想要的行都以\ { % or /开头。也许像这样简单的事情对您有用?

^(?:\\|\{|\%|\/).+(?:\\|/)

enter image description here

Regex Demo

^                start at line start
(?:\\|\{|\%|\/)  non-matching group with different string starts
.+               match any character
(?:\\|/)         match until reaches \ or /

Online Code Editor

pattern = re.compile(r'^(?:\\|\{|\%|\/).+(?:\\|/)', re.M)

答案 1 :(得分:2)

我不确定我是否完全了解您对要捕获的内容的意图,但是下面的代码应该为您给出的示例提供所需的输出。

pattern = re.compile(r'(?:^\\.+\\)|(?:^%.+%\\.+\\)|(?:^{.+}\\(?:.+\\)?)|(?:^/.+/)', re.I | re.M)
matches = re.findall(pattern, txt)
print(*matches, sep='\n')

打印为输出:

\Files\System\ado\
{drive of encrypted files}\
%Program Files%\Common Files\System\ado\
/home/user/web/

可以在here中找到所使用的正则表达式模式的说明。

答案 2 :(得分:2)

readability counts起,我建议不要不要编写自己的正则表达式,而是使用os.path.dirnameurllib.parse.urlparse。后者匹配以C:\

开头的URL和文件路径。
from os.path import dirname, join
from urllib.parse import urlparse

txt = r'''
\Files\System\ado\
C:\Dir\me\match1\poq!"&\file.txt
http://example/uploads/ssh/
{drive of encrypted files}\FreezedByWizard.README.TXT
%Program Files%\Common Files\System\ado\
/home/user/web/other.longextension
'''

result = [dirname(line) for line in txt.split("\n") if not urlparse(line).scheme]

结果是:

\Files\System\ado
{drive of encrypted files}
%Program Files%\Common Files\System\ado
/home/user/web

如果需要在末尾加反斜杠,则可以easily add them by using os.path.join

result = [join(dirname(line), '') for line in txt.split("\n") if not urlparse(line).scheme]

现在result包含以下条目:

\Files\System\ado\
{drive of encrypted files}\
%Program Files%\Common Files\System\ado\
/home/user/web\