it-swarm-pt.tech

Obter a string entre colchetes em Python

Eu tenho uma string de amostra <alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card] ...>, created=1324336085, description='Customer for My Test App', livemode=False>

Eu quero apenas o valor cus_Y4o9qMEZAugtnW e NOT card (que está dentro de outro [])

Como eu poderia fazer isso da maneira mais fácil possível em Python? Talvez usando o RegEx (que eu não sou bom em)?

19
user993563

E se:

import re

s = "alpha.Customer[cus_Y4o9qMEZAugtnW] ..."
m = re.search(r"\[([A-Za-z0-9_]+)\]", s)
print m.group(1)

Para mim isso imprime:

cus_Y4o9qMEZAugtnW

Observe que a chamada para re.search(...) encontra a primeira correspondência com a expressão regular, portanto, não encontra o [card], a menos que você repita a pesquisa uma segunda vez.

Edit: A expressão regular aqui é um literal de string python raw , que basicamente significa que as barras invertidas não são tratadas como caracteres especiais e são passadas para o método re.search() inalterado. As partes da expressão regular são:

  1. \[ corresponde a um caractere literal [
  2. ( inicia um novo grupo
  3. [A-Za-z0-9_] é um conjunto de caracteres correspondente a qualquer letra (maiúscula ou minúscula), dígito ou sublinhado
  4. + corresponde ao elemento precedente (o conjunto de caracteres) uma ou mais vezes.
  5. ) termina o grupo
  6. \] corresponde a um caractere literal ]

Edit: Como D K apontou, a expressão regular poderia ser simplificada para:

m = re.search(r"\[(\w+)\]", s)

já que \w é uma seqüência especial que significa a mesma coisa que [a-zA-Z0-9_] dependendo das configurações re.LOCALE e re.UNICODE.

45
srgerg

Isso deve fazer o trabalho:

re.match(r"[^[]*\[([^]]*)\]", yourstring).groups()[0]
9
redShadow

Você poderia usar str.split para fazer isso.

s = "<alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card]\
 ...>, created=1324336085, description='Customer for My Test App',\
 livemode=False>"
val = s.split('[', 1)[1].split(']')[0]

Então nós temos:

>>> val
'cus_Y4o9qMEZAugtnW'
8
David Alber
your_string = "lnfgbdgfi343456dsfidf[my data] ljfbgns47647jfbgfjbgskj"
your_string[your_string.find("[")+1 : your_string.find("]")]

cortesia: Expressão regular para retornar texto entre parênteses

3
OmaL

Você também pode usar

re.findall(r"\[([A-Za-z0-9_]+)\]", string)

se houver muitas ocorrências que você gostaria de encontrar. 

Veja também para mais informações: Como posso encontrar todas as correspondências para uma expressão regular em Python?

0
Brandon Keith Biggs

Você pode usar

import re

s = re.search(r"(\[.*?]", string)
print(s.group(0))
0
shubham