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

3 投票
6 回答
1403 浏览
提问于 2025-04-11 18:16

我现在正在和正则表达式斗争,边打字边琢磨。

我想为以下示例文件确定一个模式:b410cv11_test.ext。我希望能够搜索与这个示例文件匹配的文件模式。我该从哪里开始呢?我现在感到很迷茫,想知道最好的方法是什么,以便找到最符合这个文件模式的解决方案。提前谢谢大家。

问题进一步说明:

我希望这个模式是这样的:必须以'b'开头,接着是三个数字,然后是'cv',再接着是两个数字,之后是一个下划线,接着是'release',最后是'.ext'。

6 个回答

4

我想要的格式是这样的:必须以'b'开头,接着是三个数字,然后是'cv',再接两个数字,接着是一个下划线,后面是'release',最后以'.ext'结尾。

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

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

首先,你有一个叫做 glob 的模块,它可以处理文件名的规则,就像Windows和Unix系统中的命令行一样。

其次,你有一个叫做 fnmatch 的模块,它主要是用Unix系统的规则来进行模式匹配。

第三,你有一个叫做 re 的模块,它提供了完整的正则表达式功能。

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

12

现在你已经有了一个人类可读的文件名描述,把它转化成正则表达式其实很简单(至少在这个例子中是这样;)

必须以

开头的符号是尖头符号(^),它把正则表达式固定在你想匹配的内容的开头,所以你的正则表达式必须以这个符号开始。

'b',

在正则表达式中,任何非特殊字符都会字面匹配,所以这一部分你只需要用“b”:^b

后面跟着[...]数字,

这部分取决于你使用的正则表达式的类型:

最通用的表达方式是使用方括号([])。方括号的意思是“匹配括号内列出的任意一个字符”。比如,[ASDF]可以匹配中的任意一个,[0-9]则可以匹配0到9之间的任何数字。

你的正则表达式库可能有一个快捷方式来表示“任何数字”。在sedawk中,你可以使用[[:digit:]],而在python和许多其他语言中,你可以用\d

所以现在你的正则表达式变成了^b\d

后面跟着三个[...]

最简单的表达方式就是把这个部分重复三次:\d\d\d

同样,你的语言可能提供了一个快捷方式:大括号({})。有时你需要用反斜杠来转义它们(如果你使用的是sed或awk,了解一下“扩展正则表达式”)。大括号还可以让你表示“至少x次,但不超过y次的前一个部分”:{x,y}

现在你有了:^b\d{3}

后面跟着'cv',

这部分也是字面匹配,现在我们有了^b\d{3}cv

后面跟着两个数字,

这部分我们已经讲过了:^b\d{3}cv\d{2}

然后是一个下划线,后面是'release',再后面是.'ext'

这一部分也都是字面匹配,但点号(.)是一个特殊字符。这意味着你需要用反斜杠来转义它:^\d{3}cv\d{2}_release\.ext

如果不加反斜杠的话,像“b410cv11_test_ext”这样的文件名也会匹配,这可能会对你造成问题,也可能不会。

最后,如果你想确保在“.ext”后面没有其他内容,可以用美元符号($)把正则表达式固定在匹配内容的末尾。

因此,针对你特定问题的完整正则表达式是:

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

简单吧。

无论你使用什么语言或库,文档中一定有参考资料可以告诉你在你的情况下确切的语法应该是什么。一旦你学会了将问题分解成合适的描述,理解更高级的构造就会逐步变得容易。

撰写回答