我有多个以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 :(得分:2)
答案 1 :(得分:2)
import re
ptrn = re.compile(r"ds(\d+).*")
ptrn.findall(strn)
答案 2 :(得分: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']
答案 3 :(得分:1)
答案 4 :(得分:1)
您可以使用(?mi)(?<=^ds)([a-z0-9])+
匹配ds
后的任何数字或字母。我假设ds
始终位于一行的开头,并且您有一个要搜索的多行字符串。
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']