Я работаю над программой с регулярными выражениями, я должен их фильтровать, но я не могу понять, как это сделать. Я хочу сопоставить каждое красное, xxxx или xxxx, красное выражение в моей строке и поместить цвета xxxx в группу. Вот мой код:
string = "blue,red red,yellow blue,yellow red,green purple red, ..."
regex = re.compile('(?:red,(?P<redfirst>\w+)|(?P<othercolorfirst>\w+),red)')
Затем я пишу:
for match in regex.finditer(string):
if match.group('redfirst')!= "None":
print(match.group("redfirst"))
Но я все равно получаю печать, например:
None
yellow
green
None
Я не хочу, чтобы результаты "Нет" появлялись, я должен пропустить их, если это возможно, умным способом. Спасибо за помощь!
EDIT. Отсутствие кавычек не работает.
>>> import re
>>> regex = re.compile('(?:red,(?P<redfirst>\w+)|(?P<othercolorfirst>\w+),red)')
>>> string = "blue,red red,yellow blue,yellow red,green purple red, ..."
>>> for matches in regex.finditer(string):
... if matches.group('redfirst'):
... print matches.group('redfirst')
...
yellow
green
>>>
Результат, когда ничего не соответствует, не "None"
(строка), это None
(Singleton object). И хотя просто зачистка цитат вокруг " None
в вашем состоянии работает, он предпочитает использовать ... is None
по многочисленным причинам, самое главное, что это в руководстве по стилю (эй, согласованность выигрывает - обычно) и что он не сломать плохо написанную __eq__
(не проблема здесь и больше паранойи в любом случае, но поскольку нет недостатков, почему бы и нет?).
Я бы предложил что-то вроде этого:
>>> redfirst, othercolorfirst = zip(*(m.groups() for m in regex.finditer(string)))
>>> redfirst
(None, 'yellow', 'green')
>>> othercolorfirst
('blue', None, None)
>>> filter(None, redfirst)
('yellow', 'green')
>>> filter(None, othercolorfirst)
('blue',)
>>> print "\n".join(filter(None, redfirst))
yellow
green
None
не является встроенным и доступен во всем мире, иgroup
будет документально не возвращатьNone
, когда группа не совпадает.