2015-09-14 2 views
2

У меня есть строка, которая включает в себя произвольное число пар:условные регулярные выражения - замечать ошибки

A = B, C = D, E = F

Это строка опций, так что я знаю «A "," C "и" E ". Я могу запросить их, если захочу.

Я хочу найти искаженных пары в строке:

A=B, C, E=F # C has no equals or value 
A=, C=D, E=F # A has no value 
A=B, C=D, E=F X # what is X doing there! 

Конечно, А, С и Е являются необязательными и могут появляться в любом порядке.

Каков элегантный способ захвата всех пар, заметив ошибку? Теперь я могу захватить пары, используя re.findall(...), но я не могу в третьем случае выше.

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

re.findall('\s*(\w+)\s*=\s*(?P<Q>[\'\"])(\w*)(P=Q)\s*,{0,1}', a_string) 

Если бы я знал, что a_string был полностью израсходован, я был бы счастливым парнем.

ответ

5

Разделите и напечатайте строки, которые не находятся в шаблоне, например A=B.

>>> def malformed(s): 
    return [i for i in s.split(', ') if not re.search(r'^[A-Z]+=[A-Z]+$', i)] 

>>> print(malformed('A=, C=D, E=F')) 
['A='] 
>>> print(malformed('A=B, C=D, E=F X')) 
['E=F X'] 
>>> print(malformed('A=B, C, E=F')) 
['C'] 
+0

Интересно, ударив по нему с другой стороны. –

+0

?? Извините, я не могу понять ваши слова. –

+0

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

1

Другой approuch будет пытаться напрямую соответствовать пары, которые не соответствуют с регулярным выражением, как:

(?<=,\s|^)(?!\s*\w+=\w+(?=,|$))([^,\n]+) 

DEMO

2

Как насчет разделения его на две части гораздо легче читать тесты ?

import re 

tests = ['A=B, C, E=F' 
     ,'A=, C=D, E=F' 
     ,'A=B, C=D, E=F X' 
     ,'A=B, C=D'] 


for test in tests: 

    print "*", test 


    if not re.match("^(\w+=\w+,)*(\w+=\w+)$", test): 
     print "Options are malformed" 

    options = re.findall("\w+=\w+", test) 


    print "Read: ", options 
    print 

Пример вывода:

* A=B, C, E=F 
Options are malformed 
Read: ['A=B', 'E=F'] 

* A=, C=D, E=F 
Options are malformed 
Read: ['C=D', 'E=F'] 

* A=B, C=D, E=F X 
Options are malformed 
Read: ['A=B', 'C=D', 'E=F'] 

* A=B, C=D 
Read: ['A=B', 'C=D']