Я хочу получить первое совпадение регулярного выражения.
В этом случае у меня получился список:
text = 'aa33bbb44'
re.findall('\d+',text)
['33', '44']
Я мог извлечь первый элемент списка:
text = 'aa33bbb44'
re.findall('\d+',text)[0]
'33'
Но это работает, только если есть хотя бы одно совпадение, иначе я получу ошибку:
text = 'aazzzbbb'
re.findall('\d+',text)[0]
IndexError: список индекса вне допустимого диапазона
В этом случае я мог бы определить функцию:
def return_first_match(text):
try:
result = re.findall('\d+',text)[0]
except Exception, IndexError:
result = ''
return result
Есть ли способ получить этот результат без определения новой функции?
len(re.findAll)==0
вместо этого использовать проверку.Ответы:
Вы можете встроить
''
значение по умолчанию в свое регулярное выражение, добавив|$
:>>> re.findall('\d+|$', 'aa33bbb44')[0] '33' >>> re.findall('\d+|$', 'aazzzbbb')[0] '' >>> re.findall('\d+|$', '')[0] ''
Также работает с
re.search
указанными другими:>>> re.search('\d+|$', 'aa33bbb44').group() '33' >>> re.search('\d+|$', 'aazzzbbb').group() '' >>> re.search('\d+|$', '').group() ''
источник
findall
использован?» .Если вам нужно только первое совпадение, используйте
re.search
вместоre.findall
:>>> m = re.search('\d+', 'aa33bbb44') >>> m.group() '33' >>> m = re.search('\d+', 'aazzzbbb') >>> m.group() Traceback (most recent call last): File "<pyshell#281>", line 1, in <module> m.group() AttributeError: 'NoneType' object has no attribute 'group'
Затем вы можете использовать
m
в качестве условия проверки как:>>> m = re.search('\d+', 'aa33bbb44') >>> if m: print('First number found = {}'.format(m.group())) else: print('Not Found') First number found = 33
источник
Я бы пошел с:
r = re.search("\d+", ch) result = return r.group(0) if r else ""
re.search
в любом случае ищет только первое совпадение в строке, поэтому я думаю, что это делает ваше намерение немного более ясным, чем использованиеfindall
.источник
Вам вообще не следует использовать
.findall()
-.search()
это то, что вы хотите. Он находит самое левое совпадение, которое вы хотите (или возвращает,None
если совпадения не существует).m = re.search(pattern, text) result = m.group(0) if m else ""
Хотите ли вы поместить это в функцию, зависит от вас. Это необычно , чтобы хотеть вернуть пустую строку , если совпадение не найдено, поэтому ничего подобного не встраивается. Это невозможно запутаться о том ,
.search()
на своих находках матч (возвращается ,None
если это не так, илиSRE_Match
объект если бы это было).источник
Ты можешь сделать:
x = re.findall('\d+', text) result = x[0] if len(x) > 0 else ''
Обратите внимание, что ваш вопрос не совсем связан с регулярным выражением. Скорее, как безопасно найти элемент в массиве, если его нет.
источник
Возможно, это будет работать немного лучше, если больший объем входных данных не содержит нужного вам элемента, потому что except имеет большую стоимость.
def return_first_match(text): result = re.findall('\d+',text) result = result[0] if result else "" return result
источник