2015-08-12 2 views
1

У меня есть большой список данных и еще один список шаблонов. Я пытаюсь фильтровать данные с помощью шаблонов. Вот мой код, используя некоторые данные выборки:Как сгенерировать этот код динамически в Python?

dataList = [ '4334 marked val 5656 bin', 
    '76-67-34 done this 99', 
    'bin ket AZZ3R434 pid' 
] 

for data in dataList: 
    regexList = [ re.search(r'val ([\d]+) bin', data), 
      re.search(r'bin ket ([A-Z\d-]+)\b', data) 
     ] 

    for reg in regexList: 
     if reg:     #If there's a match 
      #...do something... 
      break 

В приведенном выше коде в regexlist «re.search()» часть становится повторяется снова и снова. Я хочу, чтобы только список моделей, что-то, как показано ниже:

regexList = [ 'val ([\d]+) bin', 
     'bin ket ([A-Z\d-]+)\b' 
    ] 

И использовать эти шаблоны один за другим с re.search позже(). Я пробовал использовать eval() и exec() и то и другое, но просто продолжал получать ошибки.

Я также хотел бы знать, создается ли regexList снова и снова под циклом for?

ответ

2

Я не понимаю, зачем вам нужно это делать с помощью eval/exec. Просто передайте шаблон на re.search внутри цикла:

regexList = [ 
    r'val ([\d]+) bin', 
    r'bin ket ([A-Z\d-]+)\b' 
] 
for pattern in regexList: 
    if re.search(pattern, data): 
     ... 
+0

Да, это может быть сделано таким образом. Круто. Но было интересно, как это сделать с exec/eval. –

1
dataList = [ '4334 marked val 5656 bin', 
    '76-67-34 done this 99', 
    'bin ket AZZ3R434 pid' 
] 

regexList = [ 
     r'val ([\d]+) bin', 
     r'bin ket ([A-Z\d-]+' 
] 
for data in dataList: 
    for reg in regexList: 
     if re.search(reg,data):     #If there's a match 
      #...do something... 
      break 
-1

я хотел бы предложить использовать «маршрутизатор» (например Dromeo, я автор), дело в том, что маршрутизатор соответствует шаблонам и выполняет действия, если шаблон совпадает, так что это именно то, что вам нужно точно.

Пример:

import Dromeo 

router = Dromeo() 

router.on('4334 marked val {%INT%:val} bin', my_handler) 

router.route('4334 marked val 5656 bin') 

def my_handler(params): 
    # val is already typecasted to integer 
    print(params['data']['val']) 
+0

Какое преимущество имеет это (стандартный) 're' модуль? – SiHa

+0

@SiHa, например, более гибкая, проверена, автоматическая typecasting, извлекает измененные параметры по имени, не нужно явно использовать регулярные выражения и обрабатывать escaping и т. Д. Это просто предложение, можно очень хорошо использовать ' re' (который используется «Dromeo' в фоновом режиме) –

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