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 NON card (qui est à l'intérieur d'un autre [])

Comment pourrais-je le faire de la manière la plus simple possible en Python? Peut-être en utilisant RegEx (dont je ne suis pas bon)?

39
user993563 20 déc. 2011 à 04:00

6 réponses

Meilleure réponse

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, donc il ne trouve pas [card] sauf si vous répétez la recherche une deuxième fois.

Modifier: l'expression régulière est un python raw string literal , ce qui signifie essentiellement que les barres obliques inverses ne sont pas traitées comme des caractères spéciaux et sont transmises à la méthode re.search()inchangées . Les parties de l'expression régulière sont:

  1. \[ correspond à un caractère [ littéral
  2. ( commence un nouveau groupe
  3. [A-Za-z0-9_] est un jeu de caractères correspondant à n'importe quelle 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 caractère ] littéral

Modifier: Comme l'a souligné D K, l'expression régulière pourrait être simplifiée pour:

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

Car le \w est une séquence spéciale qui signifie la même chose que [a-zA-Z0-9_] selon les paramètres re.LOCALE et re.UNICODE.

63
srgerg 20 déc. 2011 à 00:44

Vous pouvez aussi utiliser

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

S'il y a beaucoup d'occurrences que vous aimeriez trouver.

Voir aussi pour plus d'informations: Comment puis-je trouver toutes les correspondances avec un expression régulière en Python?

3
Community 23 mai 2017 à 11:47
your_string = "lnfgbdgfi343456dsfidf[my data] ljfbgns47647jfbgfjbgskj"
your_string[your_string.find("[")+1 : your_string.find("]")]

Courtoisie: Expression régulière pour renvoyer du texte entre parenthèses

5
Community 23 mai 2017 à 10:31

Pour ce faire, vous pouvez utiliser str.split.

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'
10
David Alber 20 déc. 2011 à 00:12

Cela devrait faire le travail:

re.match(r"[^[]*\[([^]]*)\]", yourstring).groups()[0]
12
redShadow 20 déc. 2011 à 00:09

Vous pouvez utiliser

import re

s = re.search(r"(\[.*?]", string)
print(s.group(0))
0
ehacinom 16 janv. 2019 à 07:26