我在python中看到了很多RE的东西,但对于确切的情况没什么,我似乎无法得到它。我有一个名称如下所示的文件列表:
summary_Cells_a_01_2_1_45000_it_1.txt
summary_Cells_a_01_2_1_40000_it_2.txt
summary_Cells_bb_01_2_1_36000_it_3.txt
" summary_Cells _"永远存在。然后有一串字母,长度为1,2或3。然后有" _01_2_1 _"总是。然后有一个介于400和45000之间的数字。然后有" 它"然后是0-9之间的数字,然后是#34; .txt"
我需要提取字母。
我在尝试:
match = re.search('summary_Cells_(\w)_01_2_1_(\w)_it_(\w).txt', filename)
但是没有得到任何匹配的东西。我试图获得这些字母,但后来可能想要它的号码(最后一个号码)或步骤(中间号码)。
有什么想法吗?
由于
答案 0 :(得分:2)
你错过了重复,即:
re.search('summary_Cells_(\w+)_01_2_1_(\w+)_it_(\w+).txt', filename)
\w
只会匹配一个字符
\w+
将匹配至少一个
\w*
将匹配任意金额(0或更多)
答案 1 :(得分:1)
你几乎在那里你需要做的就是在头衔小组中重复正则表达式
summary_Cells_(\w+)_01_2_1_(\w+)_it_(\w+).txt
使用示例
>>> filename="summary_Cells_a_01_2_1_45000_it_1.txt"
>>> match = re.search(r'summary_Cells_(\w+)_01_2_1_(\w+)_it_(\w+).txt', filename)
>>> match.group()
'summary_Cells_a_01_2_1_45000_it_1.txt'
>>> match.group(0)
'summary_Cells_a_01_2_1_45000_it_1.txt'
>>> match.group(1)
'a'
>>> match.group(2)
'45000'
>>> match.group(3)
'1'
注意强>
match.group(n)
将返回第n个caputre组
答案 2 :(得分:1)
你不需要一个正则表达式,模式没有什么复杂的东西,它不会改变:
s = "summary_Cells_a_01_2_1_45000_it_1.txt"
print(s.split("_")[2])
a
s = "summary_Cells_bb_01_2_1_36000_it_3.txt"
print(s.split("_")[2])
bb
如果你想要两组lettrrs:
s = "summary_Cells_bb_01_2_1_36000_it_3.txt"
spl = s.split("_")
a,b = spl[2],spl[7]
print(a,b)
('bb', 'it')
答案 3 :(得分:0)
由于你只想在开头捕捉字母,你可以这样做:
re.search('summary_Cells_(\w+)_01_2_1_[0-9]{3,6}_it_[0-9].txt', filename)
这并不会给你提供你不需要的小组。
[0-9]
查找一个数字,[0-9]{3,6}
允许3到6个数字。
答案 4 :(得分:0)
您正在使用正则表达式,但正如其他人忘记的那样,\w
包含字母数字和下划线,因此您应该使用[a-z]
代替。
re.search(r"summary_Cells_([a-z]+)_\w+\.txt", filename)
或者,正如Padraic所提到的,你可以使用str.split("_")
。