2017-02-18 5 views
0

У меня есть список в следующем формате:Python Regex шаблон соответствия

data =['| test_data_14865428_0    |', '| test_data_1486612450_0    |', '| test_template     |', '|id_1475020800_0    |'] 

Я хочу, чтобы извлечь все элементы списка в формате test_data_ * в новый список (таблицы). Таблицы списка должны сохранить имя в формате test_data_ *

Моя попытка:

import re 
tables = [] 
pattern = re.compile("| test_data\S") 

for i in range(0, len(data)): 
    if pattern.match(data[i]): 
     tables.append(data[i]) 

print(list_of_tables) 
+0

'[i for i in data if '| test_data_ 'in i] 'или' [i for in test_data, если re.search (r' \ | test_data \ S ', i)] ' –

+0

print ([i для i в test_data if re.search (r' \ | test_data \ S ', i)]) дает мне пустой список – user3535492

ответ

0

Поскольку все данные содержит подстроку test_data_ можно фильтровать для этой статической фразы, не требуя регулярных выражений:

data = filter(lambda v: 'test_data_' in v, data) 

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

data = map(lambda v: v.translate(None, " |"), data) 

Конечно, выражения могут быть объединены в составное выражение.


Одна из проблем, с регулярным выражением в исходном коде выше, что | нужно экранировать, так что будет рассматриваться в буквальном смысле. В настоящее время он рассматривается как альтернативный оператор.

Хотя, возможно, не самый элегантный реализации, следующий один вариант:

import re 
pattern = re.compile("\| *(test_data_[\d_]+)") 
def search(val): 
    found = pattern.match(val) 
    return found and found.group(1) 
print(filter(lambda f: f, map(search, data))) 

Фильтр с тождественным только удаляет записи, которые не имели ни одного совпадения.

0

Используйте filter для выбора значений, содержащих «test_data_», а затем сопоставьте функцию по этим значениям, чтобы очистить строки. Не требуется регулярное выражение.

import operator 

td = map(lambda s: s[2:].split(' ', 1)[0], 
     filter(operator.methodcaller('startswith', '| test_data_'), 
       data)) 
print(list(td))