2016-11-16 56 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

相關問題