Python 使正则表达式与点文件精确匹配

Python 使正则表达式与点文件精确匹配,python,regex,python-3.x,Python,Regex,Python 3.x,所以我已经达到了我的正则表达式能力的极限。这里有一个python正则表达式,用于将文件路径或文件uri与各个部分的命名捕获组相匹配。它似乎是工作文件,除了点文件 MATCH_PATH = re.compile( r"^(?P<uri>file://)?" + # optional file uri r"(?P<path>(?:/?[A-Z]{1}:)?" + # start of p

所以我已经达到了我的正则表达式能力的极限。这里有一个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
)
更新 也需要正确匹配

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

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

我设法清理了一下,让正则表达式与所有示例数据匹配。是否有测试环境,以便您可以看到它正在使用不同的捕获组

^(?P<uri>file:\/\/\/)?
(?P<path>(?:\/|\\|\.)?(?:[A-Z]:(?:\/|\\))?(?:[\w \-\.]+[\/\\])+)
(?P<file>\.?[\_\w ]+)?
(?P<extension>\.[\w\d]+)?$
^(?Pfile:\/\/\/)?
(P(?:/)?(?:[A-Z]:(?:\/))?(?:[\w\-\.]+[\/\])+)
(?P\.?[\\\uw]+)?
(?P\.[\w\d]+)$
我认为您的主要问题是,您没有将前面的
包含在
文件
捕获组中。为了解决这个问题,我在
文件
组中将它添加为可选的
,并解决了这个问题


我做的另一个小改动是在
扩展
组中包含扩展前面的
,但是如果您愿意,可以进行更改。

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

^
(?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>.+$)|$))?

它使用具有正向前瞻性的惰性点星,查找
。某些扩展名
(然后将其保存到
扩展名
)或行的末尾。

嗯,现在试试。我想我以前保存过它。这里有几个缺陷,尤其是字符类
\w
包括
\d
。此外,在
Python
中不需要转义正斜杠。点或减号也不需要在字符类中转义。总而言之:这有几个问题。。。它捕获扩展名中我不想要的点,在文件uri中添加一个额外的斜杠,扩展名中的
\w
允许使用下划线,这与我原来的分组不同。尽管如此,对于一个坚实的努力+1。你错过了可能的机会。(点)在文件名组中。这很好,但在例如
/foo/bar.tar.gz
,,我已经更新了问题以反映这一要求。然后您需要定义可以出现哪些文件扩展名-对于正则表达式引擎
中的bar.txt
。\u bar.txt
中的
.tar.gz
相同。它可以是任何东西,我们可能正在脱离正则表达式的功能范围(在这种情况下,我将手工解析)。基本上,我希望第一个点之前的所有内容都是名称(除非第一个字符是点,即点文件)因此
foo/bar.tar.gz
将有一个名称
bar
和一个扩展名
tar.gz
foo/.\u bar.tar.gz
将有一个名称
.\u bar
和一个扩展名
tar.gz
@JaredSmith:查看更新的答案和演示,然后使用一个否定类。
^
(?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>.+$)|$))?
(?P<filename>\.?[^.]+?(?=\.(?P<extension>.+$)|$))