找到模式' ds ***'在使用re

时间:2016-11-16 00:03:13

标签: python regex pattern-matching

我有多个以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

之间存在任何字母,我也希望获得字母表

5 个答案:

答案 0 :(得分:2)

试试这个。

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

结果:

http://imgur.com/a/G6KUO

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

试试这个:

(?<=ds)\d+[a-z]?

演示:https://regex101.com/r/sElqQg/2

答案 4 :(得分: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']