我正试图找出一种方法来比较每个目录路径与给定的正则表达式,以确定它是否与该模式匹配。
我有以下路径列表
C:\Dir
C:\Dir\data
C:\Dir\data\file1
C:\Dir\data\file2
C:\Dir\data\match1\file1
C:\Dir\data\match1\file2
我只想打印那些符合以下模式的路径 其中“*”可以替换零个或多个目录级别, match1 可以是文件或目录的名称。
C:\Dir\*\match1
我发现re.match()可以帮助我解决这个问题,但我很难弄清楚如何定义模式,我想出的那个(粘贴在下面)不起作用一点都不 item 将包含引号中的路径
re.match("((C:\\)(Dir)\\(.*)\\(match1))",item)
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
你可以去:
^C:\\Dir\\.+?match1.*
Python
中,这将是:
import re
rx = re.compile(r'C:\\Dir\\.+?match1.*')
files = [r'C:\Dir', r'C:\Dir\data', r'C:\Dir\data\file1', r'C:\Dir\data\file2', r'C:\Dir\data\match1\file1', r'C:\Dir\data\match1\file2']
filtered = [match.group(0)
for file in files
for match in [rx.match(file)]
if match]
print(filtered)
或者,如果您喜欢filter()
和lambda()
:
filtered = list(filter(lambda x: rx.match(x), files))
答案 1 :(得分:0)
你的正则表达式是:
^C:\\Dir\\.*match1
说明是:
C:\\Dir\\
是您路径的起始子字符串
.*
路径中的任何其他符号
match1
显式名称后面的内容(文件或目录)
答案 2 :(得分:0)
由于我没有评论的声誉,我会在这里说。
@Jan提出的解决方案适用于特定的路径列表,但如果作为一般解决方案应用,则存在一些问题。如果路径列表如下:
>>> print paths
C:\Dir
C:\Dir\data
C:\Dir\match1
C:\Dir\data\file1
C:\Dir\data\match1\file1
C:\Dir\data\match1\file2
C:\Dir\data\abcmatch1def\file3
C:\Dir\data\file1\match12
C:\Dir\data\file1\match1
>>>
(r'C:\ Dir \。+?match1。*')无法匹配“C:\ Dir \ match1”并产生误报,即“C:\ Dir \ data \ abc match1 def \ file3“和”C:\ Dir \ data \ file1 \ match1 2“。
建议的解决方案:
>>> import re
>>> for line in paths.splitlines():
... if re.match(r"C:\\Dir.*\\match1(\\|$)", line):
... print line
...
C:\Dir\match1
C:\Dir\data\match1\file1
C:\Dir\data\match1\file2
C:\Dir\data\file1\match1
>>>