我尝试了以下代码。
import re
regobj = re.compile(r"^.+\.(oth|xyz)$")
for test in ["text.txt", "other.oth", "abc.xyz"]:
if regobj.match(test):
print("Method 1:", test)
regobj = re.compile(r"^.+\.[^txt]$")
for test in ["text.txt", "other.oth", "abc.xyz"]:
if regobj.match(test):
print("Method 2:", test)
我希望第二种方法找到任何没有扩展名txt
的文件,但我尝试的方式不是好的。我做错了什么?
答案 0 :(得分:2)
正则表达式在这里过度。使用str.endswith()
method:
if not str.endswith('.txt'):
您的正则表达式使用负字符类,它是不应匹配的 set 字符。任何不是t
或x
的内容都将满足该测试。您可以明确匹配.txt
并使用not
排除而不是包含:
regobj = re.compile(r"^.+\.txt$")
if not regobj.match(test):
如果您只能使用正则表达式,请使用否定先行断言;
regobj = re.compile(r"^[^.]+\.(?!txt$)[^.]+$")
此处(?!...)
仅匹配以下 no 文字txt
的位置,一直到字符串末尾。然后[^.]+
匹配任何数量的字符,这些字符不是.
字符,直到字符串结尾。
答案 1 :(得分:1)
将第二个正则表达式更改为,
regobj = re.compile(r"^.+\.(?!txt$)[^.]+$")
[^txt]
匹配任何不属于t
或x
的字符。 (?!txt$)
声明点不会被txt
跟随。并且[^.]+
之后的\.
断言必须至少有一个字符必须存在于点之后。因此,这与具有任何扩展名但不包含.txt
答案 2 :(得分:0)
正如Martijn Pieters提到的那样regex
是过度的,考虑到还有其他更有效的方法:
fileName, fileExt = os.path.splitext(string)
使用splitext
分隔扩展名很简单。
import os
fileDict = ["text.txt", "other.oth", "abc.xyz"]
matchExt = ".txt"
for eachFile in fileDict:
fileName, fileExt = os.path.splitext(eachFile)
if matchExt not in fileExt:
print("(not %s) %s %s" % (matchExt, fileExt, fileName))
您可以轻松添加else
语句以匹配其他扩展程序,我将留给您。