2011-02-02 54 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)] 
相关问题