wake-up-neo.com

Holen Sie sich die Zeichenfolge in Klammern in Python

Ich habe eine Beispielzeichenfolge <alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card] ...>, created=1324336085, description='Customer for My Test App', livemode=False>

Ich möchte nur den Wert cus_Y4o9qMEZAugtnW und NICHT card (der sich in einem anderen [] befindet)

Wie kann ich das in Python so einfach wie möglich machen? Vielleicht mit RegEx (wozu ich nicht gut bin)?

19
user993563

Wie wäre es mit:

import re

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

Für mich druckt das:

cus_Y4o9qMEZAugtnW

Beachten Sie, dass der Aufruf von re.search(...) die erste Übereinstimmung mit dem regulären Ausdruck findet, also den [card] nicht findet, es sei denn, Sie wiederholen die Suche ein zweites Mal.

Edit: Der reguläre Ausdruck Hier handelt es sich um ein Python Rohes Stringliteral , was im Wesentlichen bedeutet, dass die umgekehrten Schrägstriche nicht als Sonderzeichen behandelt werden und unverändert an die re.search()-Methode übergeben werden. Die Teile des regulären Ausdrucks sind:

  1. \[ entspricht einem literalen [-Zeichen
  2. ( beginnt eine neue Gruppe
  3. [A-Za-z0-9_] ist ein Zeichensatz, der mit jedem Buchstaben (Groß- oder Kleinschreibung), Ziffern oder Unterstrichen übereinstimmt
  4. + stimmt ein- oder mehrmals mit dem vorhergehenden Element (dem Zeichensatz) überein.
  5. ) beendet die Gruppe
  6. \] entspricht einem literalen ]-Zeichen

Edit: Wie D K hervorgehoben hat, könnte der reguläre Ausdruck folgendermaßen vereinfacht werden:

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

da \w eine spezielle Sequenz ist, die je nach [a-zA-Z0-9_] und re.LOCALE dasselbe wie re.UNICODE bedeutet.

45
srgerg

Dies sollte die Arbeit erledigen:

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

Sie können dazu str.split verwenden.

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]

Dann haben wir:

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

höflichkeit: Regulärer Ausdruck, um Text zwischen Klammern zurückzugeben

3
OmaL

Sie können auch verwenden

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

wenn es viele Vorkommnisse gibt, die Sie gerne finden würden. 

Siehe auch für weitere Informationen: Wie finde ich alle Übereinstimmungen mit einem regulären Ausdruck in Python?

0

Sie können verwenden

import re

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