我写了这个模式
^.*\.(?!jpg$|png$).+$
但是有一个问题 - 这个模式匹配file.name.jpg(2个点)
它在filename.jpg上正常工作(不匹配)。我试图弄清楚如何使它与任何.jpg文件不匹配,即使文件的名称中有2个或更多点。我尝试使用后面的外观,但python抱怨没有使用固定宽度(我不完全确定这意味着什么,但文件名将是可变长度。)
答案 0 :(得分:10)
这应该有效:^.*\.(?!jpg$|png$)[^.]+$
答案 1 :(得分: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)([^\.]|$)
答案 2 :(得分:2)
如果你只关心字符串不以.jpg
或.png
结尾,你可以使用:
^.+$(?<!\.jpg)(?<!\.png)
^.+
并非严格必要,但根据JSON解析器的编码方式,您可能需要强制正则表达式使用整个字符串。如果您正在使用正则表达式进行其他验证,您可能需要更复杂的内容,例如:
^\w+(?:\.\w+)+$(?<!\.jpg)(?<!\.png)
您可能尝试使用(?<!\.jpg|\.png)
,这是行不通的,因为Python的正则表达式风格是最具限制性的外观之一。 PHP和Ruby 1.9+会接受它,因为每个备选方案都有固定的长度。它们甚至不必是相同的长度; (?<!\.jpg|\.jpeg|\.png)
也可以。只是不要试图将点分解出来,如(?<!\.(?:jpg|jpeg|png))
;交替必须处于后视的顶层。
Java会接受这个分解出来的版本,因为它在编译时做了一些工作来确定lookbehind可能需要匹配的最大字符数。虽然lookbehind表达式需要相当简单,但它不能使用+
或*
量词。最后,.NET和JGSoft版本对lookbehinds没有任何限制。但是Python做了一个非常简单的尝试来弄清楚lookbehind需要匹配的确切字符数,在失败时生成那个神秘的错误消息。
答案 3 :(得分: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
如果这不是您想要的,请按照您的期望更新您的问题。
答案 4 :(得分:0)
请尝试
.*\.(jpg$|png$)
它将在filename.jpg上正确匹配。你试图找出如何匹配任何.jpg文件,即使文件的名称中有2个或更多点,也可以正常工作。
使用python脚本时,请确保使用正确的拆分类型。
不同类型的分裂即rsplit(右分裂)和lsplit(左分裂)。