Pythonic способ написать два if-утверждения - PullRequest
3 голосов
/ 26 июля 2010

У меня есть две переменные, которые являются результатом поиска регулярных выражений.

a = re.search('some regex', str)
b = re.search('different regex', str)

Это должно вернуть объект re. Если они не None, я хочу использовать метод group (), чтобы получить строку, которой он соответствует. Вот код, который я сейчас использую для этого:

if a != None:
   a = a.group()
if b != None:
   b = b.group()

Есть ли более умный способ написать эти два оператора if? Может быть, объединить их в одну? Я думаю, что занимать 4 строки, чтобы сделать это слишком многословно.

Спасибо.

Ответы [ 5 ]

5 голосов
/ 26 июля 2010

Не затеняйте встроенный str и говорите

if a:

вместо

if a != None

Ничего другого, чтобы улучшить imho.

4 голосов
/ 26 июля 2010

a = a.group() if a else None

2 голосов
/ 26 июля 2010

Как я уже говорил, я предпочитаю не использовать повторно a и b как для объекта Match, так и для сопоставленного текста. Я бы пошел с функцией вытащить матч, как это:

>>> def text_or_none(v): return v.group() if v is not None else None
>>> a = text_or_none(re.search("\d", "foo"))
None
>>> b = text_or_none(re.search("\w+", "foo"))
foo
2 голосов
/ 26 июля 2010

Если вам действительно нужен однострочник:

a, b = a.group() if a else None, b.group() if b else None
0 голосов
/ 26 июля 2010

Вы можете немного изменить рефакторинг:

a, b = (var.group() if var is not None else None for var in (a,b) )

Это сохраняет значение a, если это, например, 0. Это конец вашего запроса.

Однако через некоторое время я пришелс этим предложением, учитывая контекст:

import re
target = """"Id","File","Easting","Northing","Alt","Omega","Phi","Kappa","Photo","Roll","Line","Roll_line","Orient","Camera"
1800,2008308_017_079.tif,530658.110,5005704.180,2031.100000,0.351440,-0.053710,0.086470,79,2008308,17,308_17,rightX,Jen73900229d
"""
print target
regs=(',(.*.tif)',',(left.*)',',(right.*)')
re_results=(result.group()
            for result in ((re.search(reg, target)
                            for reg in regs)
                           )
            if result is not None)
print list(re_results)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...