Как извлечь первое ненулевое совпадение из группы совпадений регулярного выражения в Python? - PullRequest
1 голос
/ 23 марта 2010

Предположим, у меня есть регулярное выражение (a)|(b)|(c)|(d).Если я применю его к тексту 'foobar', я получу соответствующий объект

>>> compiled = re.compile('(a)|(b)|(c)|(d)')
>>> compiled.search('foobar').groups()
(None, 'b', None, None)

Как мне извлечь 'b' отсюда?Или вообще, как извлечь первое совпадение из неизвестного числа групп (может случиться, когда регулярное выражение было построено динамически)?

Ответы [ 4 ]

4 голосов
/ 23 марта 2010
>>> g = (None, 'b', None, None)
>>> next(x for x in g if x is not None)
'b'

>>> g = (None, None, None)
>>> next((x for x in g if x is not None), "default")  # try this with filter :)
'default'

>>> g = (None, None, None)  # so you know what happens, and what you could catch
>>> next(x for x in g if x is not None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
1 голос
/ 23 марта 2010
>>> g = (None,'b',None,None)
>>> filter(None,g)
('b',)
>>> h = (None,None,None)
>>> filter(None,h)
()
1 голос
/ 23 марта 2010
filter(lambda x : x is not None, groups)[0]
1 голос
/ 23 марта 2010
reduce(lambda x, y : (x, y)[x is None], groups, None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...