正则表达式匹配带有多个扩展名的文

时间:2016-04-26 02:55:32

标签: regex filenames

是否有正则表达式与以下两个文件名的some.prefix部分相匹配?

  • xyz可以是[a-z0-9-_\ ]
  • 的任何字符
  • some.prefix部分可以是[a-zA-Z0-9-_\.\ ]中的任何字符。

我故意在.中添加some.prefix

some.prefix.xyz.xyz
some.prefix.xyz

我尝试过很多种组合。例如:

(?P<prefix>[a-zA-Z0-9-_\.]+)(?:\.[a-z0-9]+\.gz|\.[a-z0-9]+)

通过捕获abc.def.csvabc.def一起使用,但无法在abc.def.csv.gz中捕捉到它。

我主要使用Python,但我认为正则表达式本身应该适用于多种语言。

更新:这是不可能的,请参阅下面与@nowox的讨论。

2 个答案:

答案 0 :(得分:1)

我认为您的正则表达式效果很好。我建议您尝试使用regex101示例:

https://regex101.com/r/dV6cE8/3

表达式

^(?i)[ \w-]+\.[ \w-]+

应该适合你的情况:

som e.prefix.xyz.xyz
^^^^^^^^^^^
some.prefix.xyz
^^^^^^^^^^^
abc.def.csv.gz
^^^^^^^

在Python中你可以使用:

import re

text = """some.prefix.xyz.xyz
some.prefix.xyz
abc.def.csv.gz"""

print re.findall('^(?i)[ \w-]+\.[ \w-]+', text, re.MULTILINE)

将显示:

['som e.prefix', 'some.prefix', 'abc.def']

我可能会认为你对你的要求有点困惑。如果我总结一下,您的路径名由charsdot组成,例如:

foo.bar.baz.0
foobar.tar.gz
f.o.o.b.a.r

您如何将这些字符串分成基本名称和扩展名?在这里,我们认识到一些已知模式.tar.gz绝对是一个扩展,但.bar.baz.0是扩展名,还是只有.0

答案并不容易,如果没有一些提示,本世界没有正则表达式可以在100%时猜出正确​​的答案。

例如,您可以列出可接受的扩展名并制定一些标准:

  • 扩展程序与正则表达式\.\w{1,4}$
  • 匹配
  • 可以将多个扩展程序连接在一起(\.\w{1,4}){1,4}$
  • 剩下的名为basename

从中你可以构建这个正则表达式:

(?P<basename>.*?)(?P<extension>(?:\.\w{1,4}){1,4})$

答案 1 :(得分:-1)

试试这个[a-z0-9-_\\]+\.[a-z0-9-_\\]+[a-zA-Z0-9-_\.\\]+