2016-10-13 3 views
0

Я использую regex library 're' в Python (2.7) для проверки номера рейса.Python - проблема REGEX с RE с использованием функции re.compile + search

У меня не было никаких проблем с ожидаемыми результатами, используя очень полезно редактор здесь: http://regexr.com/

Моих результаты на regexr.com являются: http://imgur.com/nB0QDug

Моего кода:

import re 
test1 = 'ba116' 
###Referencelink: http://academe.co.uk/2014/01/validating-flight-codes/ 
p = re.compile('/^([a-z][a-z]|[a-z][0-9]|[0-9][a-z])[a-z]?[0-9]{1,4}[a-z]?$/g') 
m = p.search(test1) # p.match() to find from start of string only 
if m: 
print 'It works!: ', m.group() # group(1...n) for capture groups 
else: 
print 'Did not work' 

Я не уверен, почему я получаю вывод «не работает», где regexr показывает одно совпадение (как ожидалось)

Я сделал много simp ler regex lookup, и показалось, что результаты были верны, поэтому кажется, что моя строка регулярного выражения недопустима, или я неправильно использую re.complile (или, возможно, цикл if)?

'ba116' действителен и должен соответствовать.

+1

Является ли ваш код действительно отступом? Это должно вызывать синтаксическую ошибку. – zwol

+1

Удалите '/', который вам не нужен в python. Вероятно, почему он не работает – sisanared

+0

Да. Как в: http://imgur.com/QqK3HsX - я не получаю никаких ошибок; код исполняется и заканчивается «Процесс завершен с кодом завершения 0» –

ответ

1

Python's re.compile обрабатывает ваши ведущие / и заканчивает /g как часть регулярного выражения, а не как разделители и модификаторы. Это создает скомпилированный RE, который никогда не будет соответствовать чему-либо, поскольку у вас есть ^ с файлами перед ним и $ с материалом после него.

Первый аргумент re.compile должен быть строкой, содержащей только материал вы бы поместить внутри косой черты в языке, который имел /.../ регулярок обозначения. Модификатор g соответствует вызову метода findall на скомпилированном RE; в этом случае это кажется ненужным. (. Некоторые из других модификаторов, например i, s, m, соответствуют значениям, переданным в аргументе второй к re.compile)

Так это то, что ваш код должен выглядеть следующим образом:

import re 
test1 = 'ba116' 
###Referencelink: http://academe.co.uk/2014/01/validating-flight-codes/ 
p = re.compile(r'^([a-z][a-z]|[a-z][0-9]|[0-9][a-z])[a-z]?[0-9]{1,4}[a-z]?$') 
m = p.search(test1) # p.match() to find from start of string only 
if m: 
    print 'It works!: ', m.group() # group(1...n) for capture groups 
else: 
    print 'Did not work' 

r непосредственно перед открытой цитатой не имеет значения для этого регулярного выражения, но если вам нужно использовать обратную косую черту в RE, это избавит вас от необходимости удвоить все из них.

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