3

首先,我是正则表达式的新手。但到目前为止,我爱上了他们。我正在使用正则表达式从我从渲染引擎获得的图像文件名中提取信息。到目前为止,这个正则表达式工作得很好......

_([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', '']

我唯一担心的是它总是最后返回一个空字符串。无论我如何更改或操作正则表达式,它总是在列表末尾给我一个空字符串。我完全可以忽略它并继续前进,但我的问题是我的正则表达式做错了什么,或者我能做些什么让它不通过最后的空字符串?感谢您的时间。

4

3 回答 3

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().

于 2013-02-28T20:16:03.993 回答
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']
于 2013-02-28T21:48:15.200 回答
1

您可以使用过滤器()

鉴于你的例子,这将像,

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')
)
于 2015-08-10T16:09:18.327 回答