所以我已经达到了我的正则表达式能力的极限。我这里有一个 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
)
我可以通过以下方式使其匹配点文件删除可选限定符? https://regex101.com/r/j1K5k2/2之后.
在扩展名部分,但它无法匹配没有扩展名的文件(例如 makefile)或目录。我尝试放置一个点周围的非捕获组和带有可选限定符的扩展组 https://regex101.com/r/j1K5k2/1,这不起作用:扩展名与文件名分组。我可以调整它以在所有情况下正确匹配扩展名和名称,同时仍然匹配目录吗?
应匹配的示例输入:
/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
UPDATE
还需要正确匹配
/foo/bar.tar.gz
/foo/._bar.tar.gz
扩展名是tar.gz
和名字是bar
and ._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>.+$)|$))?
See regex101.com 上的演示 https://regex101.com/r/8zRU4S/3/.
Only thing I changed, is the group
filename
:
(?P<filename>\.?[^.]+?(?=\.(?P<extension>.+$)|$))
它使用带有正向前瞻的惰性点星,寻找.some_extension
(然后将其保存到extension
) 或行尾。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)