1

我正在使用脚本(Python)来查找一些文件。我将文件名与正则表达式模式进行比较。现在,我必须找到以“~”(波浪号)结尾的文件,所以我构建了这个正则表达式:

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

好吧,Python 似乎无法识别正则表达式,我不知道为什么。我在其他语言中尝试了相同的正则表达式,它运行良好,知道吗?

PD:我在必须插入的网页上阅读

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

但没有帮助:(。

非常感谢,同时我会继续阅读,看看是否找到了一些东西。

4

4 回答 4

10

re.match()仅当正则表达式在输入字符串的开头匹配时才成功。要搜索任何子字符串,请re.search()改用:

if re.search("~$", string_test):
    print "ok!"
于 2010-07-12T06:13:08.340 回答
9

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

您需要 re.match(r".*~$", whatever) ...这意味着零个或多个(除换行符之外的任何内容)后跟一个波浪号,然后是(字符串结尾或结尾之前的换行符)细绳)。

万一文件名可以包含换行符,请使用 re.DOTALL 标志并使用 \Z 而不是 $。

其他语言的“工作”:您必须使用过搜索功能。

字符串常量开头的 r 表示原始转义,例如 '\n' 是换行符,但 r'\n' 是两个字符,一个反斜杠后跟 n——也可以用 '\n' 表示。原始转义在正则表达式中节省了很多\\,应该自动使用 r"regex"

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

于 2010-07-12T06:13:51.807 回答
7

要查找文件,请glob改用,

import os
import glob

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

print files
于 2010-07-12T06:19:19.743 回答
0

正确的正则表达式和glob解决方案已经发布。另一种选择是使用该fnmatch模块:

import fnmatch
if fnmatch.fnmatch(string_test, "*~"):
    print "ok!"

这比使用正则表达式要容易一些。请注意,此处发布的所有方法本质上都是等效的:fnmatch使用正则表达式实现,glob然后使用fnmatch.

请注意,仅在 2009 年才添加了一个补丁fnmatch(六年后!),增加了对带有换行符的文件名的支持。

于 2010-07-12T07:27:04.217 回答