Python正则表达式未给出预期结果

Python正则表达式未给出预期结果,python,list,for-loop,Python,List,For Loop,尝试在python 2.5.4中对列表执行正则表达式搜索-示例代码: 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 然而,对于我得到

尝试在python 2.5.4中对列表执行正则表达式搜索-示例代码:

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']
当我只期望第一个元素时


非常感谢您的建议。

您不能在迭代列表时修改列表。只需创建一个新的:

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

顺便说一句,除非代码中的正则表达式只是更复杂的示例,否则请使用它来代替正则表达式。

您不能在迭代列表时修改列表。只需创建一个新的:

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

顺便说一句,除非代码中的正则表达式只是更复杂的示例,否则请使用它来代替正则表达式。

您在迭代列表时正在修改它。您不能这样做。

您在迭代列表时正在修改它。你不能那样做。

它可以简单得多:

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

它可以简单得多:

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

使用而不是用于此检查的过度使用的regexp。使用而不是用于此检查的过度使用的regexp。谢谢,Falmari。我确实有一行,比如list_out=list_in,这似乎仍然显示了问题所在必须在python中创建引用而不是新对象吗?@TZHX:是的,python就是这样工作的。变量只是名称。您需要执行list\u out=list\u in[:]才能获得副本。虽然在其他答案中列出理解是一个更好的方法。谢谢,法玛里。我确实有一行,比如list_out=list_in,这似乎仍然显示了问题所在必须在python中创建引用而不是新对象吗?@TZHX:是的,python就是这样工作的。变量只是名称。您需要执行list\u out=list\u in[:]才能获得副本。尽管在其他答案中列出理解是更好的方法。