Digamos que eu tenho uma string 'gfgfdAAA1234ZZZuijjk'
e quero extrair apenas a '1234'
parte.
Só sei quais serão os poucos personagens diretamente antes AAA
e depois ZZZ
da parte em que estou interessado 1234
.
Com sed
isso é possível fazer algo assim com uma string:
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
E isso vai me dar 1234
como resultado.
Como fazer a mesma coisa em Python?
Então você pode usar regexps com o módulo re também, se desejar, mas isso não é necessário no seu caso.
fonte
re
método não é mais rápido?s
,s.find
retornará-1
. o operador de fatiamentos[begin:end]
aceitará como índice válido e retornará substring indesejado.expressão regular
O acima como está falhará com um
AttributeError
se não houver "AAA" e "ZZZ" noyour_text
métodos de string
O exemplo acima retornará uma string vazia se "AAA" ou "ZZZ" não existirem
your_text
.Desafio PS Python?
fonte
fonte
AttributeError: 'NoneType' object has no attribute 'groups'
- se não houver AAA, ZZZ na string ...Surpreso que ninguém tenha mencionado isso, que é minha versão rápida para scripts únicos:
fonte
você pode fazer usando apenas uma linha de código
resultado receberá a lista ...
fonte
Você pode usar o módulo re para isso:
fonte
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
Você poderia fazer o mesmo com a
re.sub
função usando o mesmo regex.No sed básico, o grupo de captura é representado por
\(..\)
, mas em python foi representado por(..)
.fonte
Em python, a extração da string do formulário de substring pode ser feita usando o
findall
método nore
módulo expression ( ) regular .fonte
fonte
fonte
Dá
fonte
Apenas no caso de alguém ter que fazer a mesma coisa que eu. Eu tive que extrair tudo dentro de parênteses em uma linha. Por exemplo, se eu tenho uma frase como 'Presidente dos EUA (Barack Obama) se reuniu com ...' e eu quero apenas 'Barack Obama', esta é a solução:
Ou seja, você precisa bloquear o parêntese com o
slash \
sinal. Embora seja um problema sobre expressões mais regulares que o Python.Além disso, em alguns casos, você pode ver os símbolos 'r' antes da definição do regex. Se não houver prefixo r, você precisará usar caracteres de escape como em C. Aqui está mais discussão sobre isso.
fonte
Usando PyParsing
que produz:
[['1234']]
fonte
Aqui está uma solução sem regex que também considera os cenários em que a primeira subseqüência contém a segunda subseqüência. Esta função encontrará apenas uma substring se o segundo marcador estiver após o primeiro marcador.
fonte
Outra maneira de fazer isso é usar listas (supondo que a substring que você está procurando seja feita apenas de números):
fonte
Forros um que retornam outra sequência se não houver correspondência. Edit: versão melhorada usa a
next
função, substitua"not-found"
por outra coisa, se necessário:Meu outro método para fazer isso, menos otimizado, usa regex pela segunda vez, ainda não encontrou uma maneira mais curta:
fonte