2011-02-02 98 views
1

試圖做的python 2.5.4名單上的一個正則表達式搜索 - 示例代碼:Python的正則表達式沒有給預期的結果

import re 

list_in = ['heti_abcd_xyz_1234', 'heti_abcd_xyz', 'heti_abcd'] 

en = re.compile('abcd_xyz_1234$') 

for item in list_in: 
    if en.search(item) is None: 
     list_in.remove(item) 
print list_in 

對於結果,但是我得到:

['heti_abcd_xyz_1234', 'heti_abcd'] 

當我期待只有第一個元素時。

任何意見非常讚賞。

+1

使用[`.endswith()`](HTTP ://docs.python.org/library/stdtypes.html#str.endswith)而不是一個正確的表達式,這對於這個檢查來說是過分的。 – ThiefMaster 2011-02-02 16:12:52

回答

7

在迭代它時正在修改列表。你不能那樣做。

+0

謝謝,法爾瑪麗。我確實有一行像list_out = list_in - 這似乎仍然顯示問題。 =必須在python中做一個引用而不是一個新的對象嗎? – TZHX 2011-02-02 16:21:25

2

您不能在迭代列表時修改列表。只需創建一個新的:

import re 
list_in = ['heti_abcd_xyz_1234', 'heti_abcd_xyz', 'heti_abcd'] 
en = re.compile('abcd_xyz_1234$') 
new_list = [item for item in list_in if en.search(item) is not None] 
print new_list 

順便說一句,使用.endswith()而不是一個正則表達式,除非在代碼中的正則表達式僅僅是一些更復雜的例子。

+0

+1 - 謝謝你的提示 – TZHX 2011-02-02 16:37:40

3

它可以是一個簡單得多:

>>> list_in = ['heti_abcd_xyz_1234', 'heti_abcd_xyz', 'heti_abcd'] 
>>> [x for x in list_in if x.endswith("abcd_xyz_1234")] 
['heti_abcd_xyz_1234'] 

如果你想,對於任意正則表達式有效的解決方案,你可以這樣做:

pattern = re.compile("your_regex") 
new_list = [x for x in list_in if pattern.search(x)] 
相關問題