首先,我是regex的新手。但到目前为止,我爱上了他们。我正在使用正则表达式从我从渲染引擎获得的图像文件名中提取信息。到目前为止,这个正则表达式工作正常...
_([a-z]{2,8})_?(\d{1,2})?(\.|_)(\d{3,10})\.([a-z]{2,6})$
如果我对文件名使用split()方法,例如......
image_file_name_ao.0001.exr
我回来了我可以使用的好小清单......
['image_file_name', 'gi', None, '.', '0001', 'exr', '']
我唯一担心的是它总是最后返回一个空字符串。无论我如何更改或操纵正则表达式,它总是在列表的末尾给我一个空字符串。我完全放弃了忽略它并继续前进,但我的问题是我正在用我的正则表达式做错了还是我可以做些什么来使它不能通过最后的空字符串?谢谢你的时间。
答案 0 :(得分:3)
难怪。 split
方法在正则表达式的出现时拆分字符串(加上返回组范围)。并且由于你的正则表达式只匹配直到行结尾的子字符串(由$
结尾表示),所以没有什么可以在文件名的末尾分开但是后缀为空''
)。
鉴于您已在表达式中使用“(...)
”群组,您也可以使用re.match(regex, string)
。这将为您提供MatchObject
个实例,您可以通过groups()
从中检索包含您的论坛的元组:
# additional group up front
reg='(\S*)_([a-z]{2,8})_?(\d{1,2})?(\.|_)(\d{3,10})\.([a-z]{2,6})$'
print re.match(reg, filename).groups() # request tuple of group matches
编辑:我真的很抱歉,但我没有意识到你的模式与第一个字符的文件名字符串不匹配。我在答案中扩展了它。如果您想使用split()
坚持使用您的方法,您也可能会更改原始模式,使文件名的最后一部分不匹配,从而拆分。
答案 1 :(得分:1)
有趣的问题。
我改变了一点正则表达式的模式:
import re
reg = re.compile('_([a-z]{2,8})'
'_?(\d\d?)?'
'([._])'
'(\d{3,10})'
'\.'
'(?=[a-z]{2,6}$)')
for ss in ('image_file_name_ao.0001.exr',
'image_file_name_45_ao.0001.exr',
'image_file_name_ao_78.0001.exr',
'image_file_name_ao78.0001.exr'):
print '%s\n%r\n' % ( ss, reg.split(ss) )
结果
image_file_name_ao.0001.exr
['image_file_name', 'ao', None, '.', '0001', 'exr']
image_file_name_45_ao.0001.exr
['image_file_name_45', 'ao', None, '.', '0001', 'exr']
image_file_name_ao_78.0001.exr
['image_file_name', 'ao', '78', '.', '0001', 'exr']
image_file_name_ao78.0001.exr
['image_file_name', 'ao', '78', '.', '0001', 'exr']
答案 2 :(得分:1)
您可以使用filter()
鉴于你的例子,这就像,
def f(x):
return x != ''
filter
(
f,
re.split('_([a-z]{2,8})_?(\d{1,2})?(\.|_)(\d{3,10})\.([a-z]{2,6})$',
'image_file_name_ao.0001.exr')
)