如何将以下文件名转换为Python中的正则表达式?

时间:2008-11-21 21:08:08

标签: python regex

我在打字时正在与正则表达式作斗争。

我想确定以下示例文件的模式:b410cv11_test.ext。我希望能够搜索与上述示例文件的模式匹配的文件。我从哪里开始(如此迷失和困惑)以及获得最符合文件模式的解决方案的最佳方法是什么?提前致谢。

进一步澄清问题:

我希望模式如下:必须以'b'开头,后跟三位数字,然后是'cv',接着是两位数字,然后是下划线,接着是'release',接着是'。'分机'

6 个答案:

答案 0 :(得分:11)

既然你有一个人类可读的文件名描述,那么将其翻译成正则表达式是非常简单的(至少在这种情况下;)

  

必须以

开头

插入符号(^)将正则表达式锚定到您想要匹配的开头,因此您必须以此符号开头。

  

'B',

你的re中的任何非特殊字符都会按字面意思匹配,所以你只需使用“b”来表示这一部分:^b

  

后跟[...]位数,

这取决于您使用哪种口味:

表达这一点的最常用方法是使用括号([])。这些意思是“匹配。[ASDF]中列出的任何一个字符,例如匹配ASDF,{{1}将匹配0到9之间的任何内容。

你的图书馆可能有“任何数字”的快捷方式。在[0-9]sed中,您可以使用awk [sic!],在python和许多其他语言中,您可以使用[[:digit:]]

所以现在你重新阅读\d

  

后面跟着三个[...]

表达这一点的最简单方法是重复原子三次,如下所示:^b\d

您的语言可能会提供快捷方式:大括号(\d\d\d)。有时您必须使用反斜杠来逃避它们(如果您使用sed或awk,请阅读“扩展正则表达式”)。它们还为您提供了一种方式来说“至少x,但不超过前一个原子的y出现”:{}

现在你有:{x,y}

  

后跟'cv',

再次进行文字匹配,现在我们有^b\d{3}

  

后跟两位数,

我们已经涵盖了这一点:^b\d{3}cv

  

然后是下划线,然后是'release',然后是.'ext'

同样,这应该完全匹配,但点(^b\d{3}cv\d{2})是一个特殊字符。这意味着您必须使用反斜杠转义它:.

省略反斜杠意味着像“b410cv11_test_ext”这样的文件名也会匹配,这对你来说可能是也可能不是问题。

最后,如果您想保证“.ext”后面没有其他内容,请将re锚定到要匹配的内容的末尾,使用美元符号(^\d{3}cv\d{2}_release\.ext)。

因此,您特定问题的完整正则表达式为:

$

易。

无论您使用何种语言或库,都必须在文档中的某处提供参考,以便向您展示您的案例中的确切语法。一旦您学会将问题分解为合适的描述,就会逐步了解更高级的结构。

答案 1 :(得分:4)

为避免混淆,请按顺序阅读以下内容。

首先,你有glob模块,它处理文件名正则表达式,就像Windows和unix shell一样。

其次,你有fnmatch模块,它只使用unix shell规则进行模式匹配。

第三,你有re模块,它是一套完整的正则表达式。

然后问另一个更具体的问题。

答案 2 :(得分:3)

  

我希望模式如此   如下:必须以'b'开头,然后是   三位数,后跟'cv',   然后是两位数,然后是   下划线,然后'释放',   然后是.'ext'

^b\d{3}cv\d{2}_release\.ext$

答案 3 :(得分:1)

你的问题有点不清楚。你说你想要一个正则表达式,但是你可能想要一个可以用ls这样的命令使用的glob风格模式吗? glob表达式和正则表达式在概念上类似,但在实践中有所不同(正则表达式功能更强大,在查找文件时,最常见的情况下,glob样式模式更容易。

另外,您认为该模式是什么?当然,*(glob)或。*(正则表达式)将匹配模式。此外, _test.ext(glob)或。 _test.ext(regexp)模式将匹配,许多其他变体也是如此。

你能更具体地说明这种模式吗?例如,您可以将其描述为“b,后跟数字,后跟cv,后跟数字......”

一旦你能用你的母语精确地解释这种模式(这必定是你的第一步),将它转换为全局或正则表达式模式通常是一项相当直接的任务。

答案 4 :(得分:0)

如果字母不重要,你可以尝试\ w \ d \ d \ d \ w \ w \ d \ d_test.ext与字母/数字模式匹配,或者b \ d \ d \ dcv \ d \ d_test.ext或两者的混合。

答案 5 :(得分:0)

使用正则表达式时,我发现Mochikit regex example是一个很好的帮助。

/^b\d\d\dcv\d\d_test\.ext$/

然后使用python re(regex)模块进行匹配。这当然是假设正则表达式真的是你需要的而不是其他人提到的glob。