如何检查给定的路径名​​是否与Python中的给定正则表达式匹配

时间:2017-04-04 13:42:40

标签: python regex

我正试图找出一种方法来比较每个目录路径与给定的正则表达式,以确定它是否与该模式匹配。

我有以下路径列表

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)

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

你可以去:

^C:\\Dir\\.+?match1.*

a demo on regex101.com


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
>>>
相关问题