Quero obter a primeira correspondência de uma regex.
Neste caso, obtive uma lista:
text = 'aa33bbb44'
re.findall('\d+',text)
['33', '44']
Eu poderia extrair o primeiro elemento da lista:
text = 'aa33bbb44'
re.findall('\d+',text)[0]
'33'
Mas isso só funciona se houver pelo menos uma correspondência, caso contrário, receberei um erro:
text = 'aazzzbbb'
re.findall('\d+',text)[0]
IndexError: índice da lista fora do intervalo
Nesse caso, eu poderia definir uma função:
def return_first_match(text):
try:
result = re.findall('\d+',text)[0]
except Exception, IndexError:
result = ''
return result
Existe uma maneira de obter esse resultado sem definir uma nova função?
len(re.findAll)==0
check em seu lugar.Respostas:
Você pode incorporar o
''
padrão em sua regex adicionando|$
:>>> re.findall('\d+|$', 'aa33bbb44')[0] '33' >>> re.findall('\d+|$', 'aazzzbbb')[0] '' >>> re.findall('\d+|$', '')[0] ''
Também funciona com
re.search
apontado por outros:>>> re.search('\d+|$', 'aa33bbb44').group() '33' >>> re.search('\d+|$', 'aazzzbbb').group() '' >>> re.search('\d+|$', '').group() ''
fonte
findall
usado?" .Se você só precisa da primeira correspondência, use em
re.search
vez dere.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'
Em seguida, você pode usar
m
como uma condição de verificação como:>>> m = re.search('\d+', 'aa33bbb44') >>> if m: print('First number found = {}'.format(m.group())) else: print('Not Found') First number found = 33
fonte
Eu iria com:
r = re.search("\d+", ch) result = return r.group(0) if r else ""
re.search
só procura a primeira correspondência na string de qualquer maneira, então acho que torna sua intenção um pouco mais clara do que usarfindall
.fonte
Você não deveria estar usando
.findall()
-.search()
é o que você quer. Ele encontra a correspondência mais à esquerda, que é o que você deseja (ou retornaNone
se não houver correspondência).m = re.search(pattern, text) result = m.group(0) if m else ""
Se você deseja colocar isso em uma função, depende de você. É incomum querer retornar uma string vazia se nenhuma correspondência for encontrada, e é por isso que nada parecido com isso está embutido. É impossível se confundir sobre se
.search()
por si só encontra uma correspondência (retornaNone
se não encontrou, ou umSRE_Match
objeto se assim fosse).fonte
Você pode fazer:
x = re.findall('\d+', text) result = x[0] if len(x) > 0 else ''
Observe que sua pergunta não está exatamente relacionada ao regex. Em vez disso, como você encontra com segurança um elemento de uma matriz, se não houver nenhum.
fonte
Talvez isso tivesse um desempenho um pouco melhor no caso de uma quantidade maior de dados de entrada não conter sua peça desejada porque exceto tem um custo maior.
def return_first_match(text): result = re.findall('\d+',text) result = result[0] if result else "" return result
fonte