12

我写了这个模式

^.*\.(?!jpg$|png$).+$

但是有一个问题 - 此模式匹配 file.name.jpg(2 点)

它在 filename.jpg 上正常工作(不匹配)。我试图弄清楚如何使它不匹配任何 .jpg 文件,即使文件名中有 2 个或更多点。我尝试使用向后看,但 python 抱怨没有使用固定宽度(我不确定这意味着什么,但文件名将是可变长度。)

4

5 回答 5

17

这应该有效:^.*\.(?!jpg$|png$)[^.]+$

于 2012-04-07T05:53:26.050 回答
3

使用os.path的漂亮函数将文件路径正确拆分为组件以便于解析:

filepath, filename = os.path.split(str)
basename, extension = os.path.splitext(filename)

if exension[1:] in ['jpg', 'png']:
  # The extension matches

试试这个正则表达式(不要这样做。它与你想做的完全相反):

\.(jpg|png)([^\.]|$)
于 2012-04-07T05:29:20.570 回答
3

如果你只关心字符串不以.jpgor结尾.png,你可以使用这个:

^.+$(?<!\.jpg)(?<!\.png)

^.+不是绝对必要的,但根据 JSON 解析器的编码方式,您可能需要强制正则表达式使用整个字符串。如果您也将正则表达式用于其他验证,您可能需要更详细的内容,例如:

^\w+(?:\.\w+)+$(?<!\.jpg)(?<!\.png)

您可能尝试过使用(?<!\.jpg|\.png),但它不起作用,因为 Python 的正则表达式风格是最受限制的一种。PHP 和 Ruby 1.9+ 会接受它,因为每个替代方案都有固定的长度。它们甚至不必是相同的长度。(?<!\.jpg|\.jpeg|\.png)也可以。只是不要试图分解点,如(?<!\.(?:jpg|jpeg|png)); 交替必须在lookbehind的顶层。

Java 会接受分解后的版本,因为它在编译时会做更多的工作来确定后向可能需要匹配的最大字符数。不过,lookbehind 表达式需要相当简单,并且不能使用+or*量词。最后,.NET 和 JGSoft 风格对lookbehinds 没有任何限制。但是 Python 做了一个非常简单的尝试来找出后向需要匹配的确切字符数,当它失败时会生成那个神秘的错误消息。

于 2012-04-07T15:23:30.583 回答
1

看起来你几乎拥有它:

.*\.(?!jpg$|png$)[^.]+

根据我的测试(在java中),我得到了这些结果:

file.jpg - false
file.png - false
file.name.jpg - false
file.name.png - false
file.gif - true
file.name.gif - true
file.jpg.gif - true
file.jpge - true

如果这不是您想要的,请根据您的期望更新您的问题。

于 2012-04-07T07:45:42.500 回答
0

请试试

    .*\.(jpg$|png$)

它将正确匹配 filename.jpg。您试图弄清楚如何匹配任何 .jpg 文件,即使文件名中有 2 个或更多点,也可以正常工作。
在使用 python 脚本时,请确保您使用的是正确的拆分类型。不同类型的拆分即 rsplit(右拆分)和 lsplit(左拆分)。

于 2012-04-07T07:14:08.103 回答