使用re

时间:2017-09-18 17:10:50

标签: python bash sed

我有一个包含多个文件的文件夹作为一个示例,我有多个不同的

_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中转换我的工作流程。我无法做到。我应该如何在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用于我自己的理解和未来的学习。

4 个答案:

答案 0 :(得分:1)

工作太多了。

newname = oldname.rsplit('_', 1)[1]

答案 1 :(得分:1)

您可以使用列表理解

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))

答案 2 :(得分:1)

你可以使用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'

实际上,在使用group(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

答案 3 :(得分:-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