2016-11-16 58 views
0

我有多个以ds开头的字符串。使用re在字符串中查找模式'ds ***'

例如,

ds000002_R2.0.2_raw.zip 
ds000002_R2.0.3_raw.zip 
ds000002_R2.0.4_raw.zip 
ds000002_R2.0.5_raw.zip 
ds000003_R2.0.0_raw.tgz 
ds000003_R2.0.1_raw.tgz 
ds002_raw_checksums.txt 
ds003_models.tgz 
ds113c_R1.0.0_sub-18.tgz 
ds113c_R1.0.0_sub-20.tgz 
ds113c_R1.0.0_sub-21.tgz 
ds113b_raw.tgz 

我该如何只提取ds***前面的数字。

所以,理想的输出应,000002, 000005, 003, 002, 113b, 113c

编辑:我想太后得到的字母,如果有ds后之间之前的任何_.file_extension

+0

所以,你要ds'和'_'权利之间'的数字? –

+0

@SumnerEvans是的。但有时候'_'可能会丢失。有可能是直接'.tgz'或任何文件扩展名。 – learnningprogramming

回答

1

您可以使用(?mi)(?<=^ds)([a-z0-9])+来匹配您的ds之后的任何数字或字母。我假设ds总是在一行的开始,并且你有一个多行字符串来搜索。

查看regexideone演示。

import re 
str = '''ds000002_R2.0.2_raw.zip 
ds000002_R2.0.3_raw.zip 
ds000002_R2.0.4_raw.zip 
ds000002_R2.0.5_raw.zip 
ds000003_R2.0.0_raw.tgz 
ds000003_R2.0.1_raw.tgz 
ds002_raw_checksums.txt 
ds003_models.tgz 
ds113c_R1.0.0_sub-18.tgz 
ds113c_R1.0.0_sub-20.tgz 
ds113c_R1.0.0_sub-21.tgz 
ds113b_raw.tgz 
ds110.tgz''' 
print(re.findall(r'(?mi)(?<=^ds)([a-z0-9]+)', str)) 

输出['000002', '000002', '000002', '000002', '000003', '000003', '002', '003', '113c', '113c', '113c', '113b', '110']

2

试试这个。

(?<=ds)(.*?)(?=[^0-9A-Fa-f]) 

结果:

http://imgur.com/a/G6KUO

+0

请使用StackOverflow图片上传器发布您的图片。 –

2
import re 
ptrn = re.compile(r"ds(\d+).*") 
ptrn.findall(strn) 
2

你可以尝试用ds([0-9A-Za-z]+)功能findall()re,既_.不属于字符类[0-9A-Za-z]分组图案全场比赛结束在_.

import re 
re.findall(r'ds([0-9A-Za-z]+)', 'ds000002_R2.0.2_raw.zip') 
#['000002'] 

re.findall(r'ds([0-9A-Za-z]+)', 'ds000002.zip') 
#['000002'] 

re.findall(r'ds([0-9A-Za-z]+)', 'ds113b_raw.tgz') 
#['113b'] 
+0

我已经更新了一下我的问题。你能给些建议么? – learnningprogramming

+0

您可以将字符类从纯数字扩展到字母数字'[0-9A-Za-z]'的情况。 – Psidom

相关问题