我在打字时正在与正则表达式作斗争。
我想确定以下示例文件的模式:b410cv11_test.ext
。我希望能够搜索与上述示例文件的模式匹配的文件。我从哪里开始(如此迷失和困惑)以及获得最符合文件模式的解决方案的最佳方法是什么?提前致谢。
进一步澄清问题:
我希望模式如下:必须以'b'开头,后跟三位数字,然后是'cv',接着是两位数字,然后是下划线,接着是'release',接着是'。'分机'
答案 0 :(得分:11)
既然你有一个人类可读的文件名描述,那么将其翻译成正则表达式是非常简单的(至少在这种情况下;)
必须以
开头
插入符号(^
)将正则表达式锚定到您想要匹配的开头,因此您必须以此符号开头。
'B',
你的re中的任何非特殊字符都会按字面意思匹配,所以你只需使用“b”来表示这一部分:^b
。
后跟[...]位数,
这取决于您使用哪种口味:
表达这一点的最常用方法是使用括号([]
)。这些意思是“匹配。[ASDF]
中列出的任何一个字符,例如匹配A
或S
或D
或F
,{{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。