【问题标题】:Matching "~" at the end of a filename with a python regular expression用python正则表达式匹配文件名末尾的“~”
【发布时间】:2011-03-14 15:53:58
【问题描述】:

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

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

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

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

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

但没有帮助:(。

非常感谢,同时我会继续阅读,看看是否有什么发现。

【问题讨论】:

    标签: python regex tilde


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

      • 谢谢它的工作,还有一个问题,你在 re.match(r".*~$", 不管) 中输入的初始 r 是什么意思,我的意思是 r 中的 r"。 *~$" 。感谢您的大力帮助!
      • @fkn_man,在这里阅读有关字符串前缀的信息:docs.python.org/release/2.5.2/ref/strings.html
      【解决方案3】:

      要查找文件,请改用glob

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

      【讨论】:

        【解决方案4】:

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

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

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

        请注意,仅在 2009 年,patch 被添加到 fnmatch(六年后!),这增加了对带有换行符的文件名的支持。

        【讨论】:

        • 正确的str.endswith('~') 解决方案也已发布。这比fnmatch 更易于使用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        相关资源
        最近更新 更多