gpt4 book ai didi

python - 使正则表达式准确匹配点文件

转载 作者:太空宇宙 更新时间:2023-11-04 02:54:19 25 4
gpt4 key购买 nike

所以我已经达到了我的正则表达式能力的极限。我这里有一个 python 正则表达式,用于将文件路径或文件 uri 与各个部分的命名捕获组相匹配。它似乎是工作文件,除了点文件。

MATCH_PATH = re.compile(
r"^(?P<uri>file://)?" + # optional file uri
r"(?P<path>(?:/?[A-Z]{1}:)?" + # start of path capture, optional windows top-level directory
r"[\\/]?" + # optional start separator
r"(?:[\w \-\.]+[\\/])+)" + # path
r"(?P<filename>[\w \-]+)?" + # optional filename
r"\.?(?P<extension>[a-zA-Z0-9]+)?$" # extension optional
)

我可以通过 removing the optional qualifier ? 使其匹配点文件在扩展部分的 . 之后,但是它无法匹配没有扩展名的文件(例如 makefile)或目录。我尝试放置一个 non-capturing group around the dot and the extension group with the optional qualifier ,那没有用:扩展名与文件名组合在一起。我可以调整它以在所有情况下都正确匹配扩展名和名称,同时仍然匹配目录吗?

应该匹配的示例输入:

/foo/bar.txt
/foo/bar/
/foo/makefile
./foo.txt
/foo/._bar.txt
foo/bar.txt
D:\foo\bar.m3u
file:///var/www/html/index.html
file:///C:/users/me/My Documents/index.html

更新

还需要正确匹配

/foo/bar.tar.gz
/foo/._bar.tar.gz

扩展名为tar.gz,名称分别为bar._bar。如果这对于正则表达式来说太复杂,请告诉我,我可以编写程序代码来拆分和处理。

最佳答案

您可以在前瞻中很好地使用命名的捕获组,如下所示:

^
(?P<uri>file://)?
(?P<path>(?:/?[A-Z]{1}:)? # start of path capture, optional windows top-level directory
[\\/]? # optional start separator
(?:[-. \w]+[\\/])+) # path
(?P<filename>\.?[^.]+?(?=\.(?P<extension>.+$)|$))?

参见 a demo on regex101.com .


我唯一改变的是组 filename :

(?P<filename>\.?[^.]+?(?=\.(?P<extension>.+$)|$))

它使用具有积极前瞻性的惰性点星,寻找 .some_extension (然后将其保存到 extension )或行尾。

关于python - 使正则表达式准确匹配点文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42913533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com