用Python正则表达式匹配文件名末尾的“~”

1 投票
4 回答
3155 浏览
提问于 2025-04-16 01:09

我正在写一个脚本(用Python)来查找一些文件。我把文件名和一个正则表达式模式进行比较。现在,我需要找到以“~”(波浪号)结尾的文件,所以我写了这个正则表达式:

if re.match("~$", string_test):
    print "ok!"

但是,Python似乎不识别这个正则表达式,我也不知道为什么。我在其他语言中试过同样的正则表达式,效果很好,有没有什么建议?

附注:我在网上看到说我需要插入

# -*- coding: utf-8 -*-

但这并没有帮助 :( 。

非常感谢,期间我会继续阅读,看看能否找到解决办法。

4 个回答

7

要查找文件,可以使用 glob 这个工具。

import os
import glob

path = '/path/to/files'
os.chdir(path)
files = glob.glob('./*~')

print files
9

你的正则表达式只会匹配字符串“~”和(相信我)“~\n”。

你需要用 re.match(r".*~$", whatever) 这个写法……意思是可以有零个或多个(除了换行符以外的任何字符),然后跟一个波浪线,再后面是字符串的结尾或者是换行符在字符串结尾之前。

如果文件名有可能包含换行符,那就用 re.DOTALL 标志,并且用 \Z 代替 $。

在其他编程语言中“有效”的意思是:你一定使用过搜索功能。

字符串前面的 r 表示原始字符串,比如 '\n' 是一个换行符,但 r'\n' 是两个字符,一个反斜杠后面跟着 n——这也可以用 '\n' 表示。原始字符串在正则表达式中可以省去很多 \\,所以应该自动使用 r"regex"。

顺便说一下:在这种情况下 避免正则表达式的混淆……用 whatever.endswith('~')

10

re.match() 这个函数只有在正则表达式和输入字符串的开头部分匹配时才会成功。如果你想在字符串中查找任何子串,应该使用 re.search() 函数:

if re.search("~$", string_test):
    print "ok!"

撰写回答