使用RE在Python中使用Regex重命名文件名



我有一个文件夹,其中包含多个文件,以下是文件名,我有多个不同的此类

_EGAZ00001018697_2014_ICGC_130906_D81P8DQ1_0153_C2704ACXX.nopd.AOCS_001_ICGCDBDE20130916001.rsem.bam

现在,我想重命名,然后仅使用ICGCDBDE20130916001.rsem.bam使用,将根据路径中的文件更改。对应于名称 *.rsem.bam的字符串应为" _"分隔的字符串。因此,对于目录中的所有文件,都应相应地替换。我正在考虑使用正则表达式,所以我想出了以下模式

pat=r'_(.*)_(.*)_(.*)_(.*)_(.w+)'

这将根据需要将我的文件名分开,我可以使用仅服用pat[4]的全局变量来重命名文件名。我想使用python,因为我现在想学习它,以在文件重命名时进行小型更改,依此类推,随着时间的流逝,随着时间的流逝,请转换我的工作流程。我无法做到。我应该如何在Python中完成这项工作?还可以解决应该是相应的bash正则是一个很大的文件名,而且我与此类相遇非常新。以下是我的代码不是直接更改,而是要了解它是否有效,但是如果我想重命名它们,我该如何工作。

import re
import os
_src = "path/bam/test/"
_ext = ".rsem.bam"
endsWithNumber = re.compile(r'_(.*)_(.*)_(.*)_(.*)_(.w+)'+(re.escape(_ext))+'$')
print(endsWithNumber)
for filename in os.listdir(_src):
    m = endsWithNumber.search(filename)
    print(m)

我都会感谢Python和Bash中的同时,我希望Python自己的理解和未来的学习。

您可以使用rpartition,将所需的零件从其余部分分离到三部分元组。

给定:

>>> fn
'_EGAZ00001018697_2014_ICGC_130906_D81P8DQ1_0153_C2704ACXX.nopd.AOCS_001_ICGCDBDE20130916001.rsem.bam'

您可以做:

>>> fn.rpartition('_')
('_EGAZ00001018697_2014_ICGC_130906_D81P8DQ1_0153_C2704ACXX.nopd.AOCS_001', '_', 'ICGCDBDE20130916001.rsem.bam')

然后:

>>> _,sep,new_name=fn.rpartition('_')
>>> new_name
'ICGCDBDE20130916001.rsem.bam'

如果您想使用正则:

>>> re.search(r'_([^_]+$)', fn).group(1)
'ICGCDBDE20130916001.rsem.bam'

实际上,您将测试在使用组(1)之前是否有匹配:

>>> m=re.search(r'_([^_]+$)', fn)
>>> new_name = m.group(1) if m else fn

对于sed,您可以做:

$ echo "$fn" | sed -E 's/.*_([^_]*)$/1/'
ICGCDBDE20130916001.rsem.bam

或bash,同一正则是:

$ [[ $fn =~ _([^_]*)$ ]] && echo "${BASH_REMATCH[1]}"
ICGCDBDE20130916001.rsem.bam

您可以使用列表理解

import re
import os
_src = "path/bam/test/"
new_s = [re.search("[a-zA-Z0-9]+.rsem.bam", filename) for filename in os.listdir(_src)]
for first, second in zip(os.listdir(_src), new_s):
    if second is not None:
         os.rename(first, second.group(0))

工作太多。

newname = oldname.rsplit('_', 1)[1]
import os  
fname = 'YOUR_FILENAME.avi'
fname1 = fname.split('.')
fname2 = str(fname1[0]) + '.mp4'
os.rename('path to your source file' + str(fname), 'path to your destination file' + str(fname2))
fname = fname2

最新更新