Фильтр результатов регулярных выражений в Python

1

Я работаю над программой с регулярными выражениями, я должен их фильтровать, но я не могу понять, как это сделать. Я хочу сопоставить каждое красное, 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. Отсутствие кавычек не работает.

Теги:

3 ответа

3
Лучший ответ
>>> 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
>>>
2

Результат, когда ничего не соответствует, не "None" (строка), это None (Singleton object). И хотя просто зачистка цитат вокруг " None в вашем состоянии работает, он предпочитает использовать ... is None по многочисленным причинам, самое главное, что это в руководстве по стилю (эй, согласованность выигрывает - обычно) и что он не сломать плохо написанную __eq__ (не проблема здесь и больше паранойи в любом случае, но поскольку нет недостатков, почему бы и нет?).

  • 0
    плохой ответ ... Я проверяю свои факты перед публикацией, Ни один без кавычек не работает для меня
  • 1
    @Kingpin: Это серьезное утверждение, вам придется поддержать его с помощью кода. None не является встроенным и доступен во всем мире, и group будет документально не возвращать None , когда группа не совпадает.
1

Я бы предложил что-то вроде этого:

>>> 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню