簡體   English   中英

python正則表達式給出空字符串

[英]python regex gives empty string

首先,我是正則表達式的新手。 但到目前為止,我愛上了他們。 我正在使用正則表達式從我從渲染引擎獲得的圖像文件名中提取信息。 到目前為止,這個正則表達式工作正常......

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

我唯一擔心的是它總是最后返回一個空字符串。 無論我如何更改或操縱正則表達式,它總是在列表的末尾給我一個空字符串。 我完全放棄了忽略它並繼續前進,但我的問題是我正在用我的正則表達式做錯了還是我可以做些什么來使它不能通過最后的空字符串? 感謝您的時間。

難怪。 split方法在正則表達式的出現時拆分你的字符串(加上返回組范圍)。 並且由於你的正則表達式只匹配直到行結束的子字符串(由結尾處的$表示),所以沒有什么可以在文件名的末尾分割,而是空后綴( '' )。

鑒於您已經在表達式中使用了“ (...) ”組,您也可以使用re.match(regex, string) 這將為您提供一個MatchObject實例,您可以從中通過groups()從中檢索包含您的組的元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()堅持你的方法,你也可能會改變原始模式,使文件名的最后一部分不匹配,從而分開。

有趣的問題。

我改變了一點正則表達式的模式:

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']

你可以使用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')
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM