Регулярное выражение Python не дает ожидаемого результата - PullRequest
1 голос
/ 02 февраля 2011

Попытка выполнить поиск по регулярному выражению по списку в 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']

когда я ожидаю только первый элемент.

Любой совет высоко ценится.

Ответы [ 3 ]

7 голосов
/ 02 февраля 2011

Вы изменяете список по мере его перебора. Вы не можете этого сделать.

3 голосов
/ 02 февраля 2011

Это может быть намного проще:

>>> 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)]
2 голосов
/ 02 февраля 2011

Вы не можете изменять список, перебирая его.Просто создайте новый:

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() вместо регулярного выражения, если регулярное выражение в вашем коде не является просто примером для чего-то более сложного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...