web-dev-qa-db-fra.com

Récupère la chaîne entre parenthèses en Python

J'ai un exemple de chaîne <alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card] ...>, created=1324336085, description='Customer for My Test App', livemode=False>

Je veux seulement la valeur cus_Y4o9qMEZAugtnW et NOT card (qui est dans un autre [])

Comment pourrais-je le faire de la manière la plus simple possible en Python?

19
user993563

Que diriez-vous:

import re

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

Pour moi cela imprime:

cus_Y4o9qMEZAugtnW

Notez que l'appel à re.search(...) trouve la première correspondance avec l'expression régulière et qu'il ne trouve donc le [card] que si vous répétez la recherche une seconde fois.

Edit: Le expression régulière ici est un python chaîne littérale brute , ce qui signifie que les barres obliques inverses ne sont pas traitées comme des caractères spéciaux et sont transmises à la méthode re.search() sans modification. Les parties de l'expression régulière sont les suivants:

  1. \[ correspond à un littéral [ caractère
  2. ( commence un nouveau groupe
  3. [A-Za-z0-9_] est un jeu de caractères correspondant à toute lettre (majuscule ou minuscule), chiffre ou trait de soulignement
  4. + correspond à l'élément précédent (le jeu de caractères) une ou plusieurs fois.
  5. ) termine le groupe
  6. \] correspond à un littéral ] caractère

Edit: Comme D K l’a souligné, l’expression régulière pourrait être simplifiée comme suit:

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

étant donné que \w est une séquence spéciale qui signifie la même chose que [a-zA-Z0-9_] en fonction des paramètres re.LOCALE et re.UNICODE.

45
srgerg

Cela devrait faire le travail:

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

Vous pouvez utiliser str.split pour le faire.

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]

Ensuite nous avons:

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

courtesy: Expression rationnelle pour retourner le texte entre parenthèses

3
OmaL

Vous pouvez aussi utiliser

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

s'il y a beaucoup d'occurrences que vous voudriez trouver. 

Voir aussi pour plus d'informations: Comment trouver toutes les correspondances à une expression régulière en Python?

0
Brandon Keith Biggs

Vous pouvez utiliser

import re

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