2012-09-16 2 views
0

Из этих двух списков:питона регулярное выражение через каждый член списка

list_A = ["eyes", "clothes", "body" "etc"] 
list_B = ["xxxx_eyes", "xxx_zzz", "xxxxx_bbbb_zzzz_clothes" ] 

Я хочу, чтобы заполнить третий список остроумие этих объекты из 2-го списка, только если какая-то часть его имен вышлет один из имен из первого списка.

В предыдущем примере, третий список должен быть:

["xxxx_eyes", "xxxxx_bbbb_zzzz_clothes"] 
+1

Допустим, что 'list_B' содержит "xxx_ccc_clothesline". Должно ли это войти в третий список, потому что «одежда» находится в 'list_A', или нет, потому что это не отдельное слово? – DSM

+0

Есть ли конкретная причина, по которой вы хотите использовать регулярное выражение? Поиск строки также будет соответствовать вашим требованиям. –

ответ

3

Если вы хотите использовать список понимание, что это будет работать:

list_C = [word for word in list_B if any(test in word for test in list_A)] 
+0

В зависимости от того, как OP относится к поведению 'in' и о том, может ли« _ »быть в любом слове в' list_A', я мог бы использовать что-то вроде '[слово в слово в list_B, если set_A & set (word. split ('_'))] вместо этого, но без обратной связи нет способа узнать. – DSM

+0

Это может быть так. – Blender

+0

Большое спасибо, он выполняет эту работу. – user1675094

2

Если вы хотите использовать regexs для это:

search = re.compile("|".join(map(re.escape, list_A))).search 
result = filter(search, list_B) 

Хотя ответа Блендера может быть достаточно в большинстве случаев.

1
In [1]: list_A = ["eyes", "clothes", "body" "etc"] 

In [2]: list_B = ["xxxx_eyes", "xxx_zzz", "xxxxx_bbbb_zzzz_clothes" ] 

In [7]: [x for x in list_B if any(y in list_A for y in x.split('_'))] 
Out[7]: ['xxxx_eyes', 'xxxxx_bbbb_zzzz_clothes'] 
+0

? 'Истина, если y в list_A else False' просто' y в list_A'. – DSM

+0

Думаю, я удалил это, пока вы комментировали. –

0

Slowest но простейшим бы:

list_A = ["eyes", "clothes", "body" "etc"] 
list_B = ["xxxx_eyes", "xxx_zzz", "xxxxx_bbbb_zzzz_clothes" ] 

list_C=[] 
for _ in list_A: 
    for __ in list_B: 
     if _ in __: 
      list_C.append(__) 
+1

Почему использование символов подчеркивания? «a» и «b» будут не только более четкими, но и короче! Обычно '_' используется только как имя переменной для обозначения« это фиктивная переменная, с которой мы ничего не сделаем ». Во-вторых, это может дать несколько копий одного и того же элемента 'list_B', если в нем содержится несколько членов' list_A', что я не уверен в этом. – DSM

+0

да, чтобы удалить дубликаты «set (list_C)». Спасибо, что указал. –

Смежные вопросы