首页 > 解决方案 > 如何将数字插入正则表达式

问题描述

我正在尝试在 2 个正则表达式组之间插入一个数字;但是,我不知道如何避免引用不同的组号。

我正在尝试使用正则表达式来更新目录中的文件名。基本上我有一个电视节目的季节,所有文件名都应该遵循“节目 - S##E## - 剧集标题”的模式

我编写了一个简单的循环来遍历文件并设置命名,但我遇到的问题是剧集编号没有在每个文件中设置为 2 位数字。我在下面包含了我试图用来解决这个问题的循环。

我尝试使用 re.sub() 将 S##E 标识为第 1 组,将以下数字标识为第 2 组,然后在两组之间插入“0”,但我最终引用了第 10 组,没有定义。我不确定如何在不引用组 0 或插入反斜杠的情况下转义组引用。

files = [f for f in os.listdir(os.path.abspath(os.curdir)) if os.path.isfile(f)]
for file in files:
    os.rename(file, re.sub(r'(S\d+E)(\d\s)',r'\10\2',file))

或者

files = [f for f in os.listdir(os.path.abspath(os.curdir)) if os.path.isfile(f)]
for file in files:
    os.rename(file, re.sub(r'(S\d+E)(\d\s),r'\1'+'0'+r'\2', file))

预期结果应该是所有文件都遵循 S##E## 模式,即使是低于 10 的剧集编号。第一个版本会导致错误,因为我指的是不存在的组。第二个似乎根本没有改变文件名。

标签: pythonregex

解决方案


文档中re.sub有关于此的注释:

\g<number>使用对应的组号;\g<2>因此等价于\2,但在诸如\g<2>0. \20将被解释为对第 20 组的引用,而不是对后跟文字字符“0”的第 2 组的引用。

所以,以更详细的方式写出组引用,这样它就很明确了:

os.rename(file, re.sub(r'(S\d+E)(\d\s)',r'\g<1>0\g<2>',file))

推荐阅读