Это ужасно, так что не делайте этого, но вы можете использовать
first, last = getattr(re.search(r"(.*) (.*)", "john smith"), 'groups', lambda: (None, None))()
, чтобы сделать то, что вы хотите, в качестве однострочного, без использования findall
(что может вернуть несколько попаданий, итак что все равно терпите неудачу, или игнорируйте пробелы в зависимости от того, ограничиваете ли вы .
до \S
).
Учитывая, что ваш шаблон соответствует буквально чему-либо с одним пробелом в нем (захватывая все до последнего пробела, ивсе, что после него), избегайте findall
, но вы не получите много, но если вы действительно хотите исключить вещи с более чем одним пробелом или вещи, которые совпадают только частично, вы можете переключить .
на \S
, ивозможно search
до fullmatch
:
first, last = getattr(re.fullmatch(r"(\S*) (\S*)", "john smith"), 'groups', lambda: (None, None))()
В любом случае он использует тот факт, что несоответствие возвращает None
, у которого нет метода groups
, поэтому getattr
может вернутьсвязанный метод groups
для совпадения или lambda
, который возвращает значения по умолчанию в противном случае.В любом случае, вы немедленно звоните и получаете результат groups
или lambda
в зависимости от ситуации.
Опять же, не делайте этого.Это законно, просто уродливо (и, вероятно, медленнее, чем любой разумный метод).