Angenommen, ich habe eine Zeichenfolge 'gfgfdAAA1234ZZZuijjk'
und möchte nur den '1234'
Teil extrahieren .
Ich weiß nur, was die wenigen Charaktere direkt vor AAA
und nach ZZZ
dem Teil sein werden, an dem ich interessiert bin 1234
.
Damit ist sed
es möglich, so etwas mit einem String zu machen:
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
Und das wird mir 1234
als Ergebnis geben.
Wie mache ich dasselbe in Python?
Dann können Sie Regexps auch mit dem Re-Modul verwenden, wenn Sie möchten, aber das ist in Ihrem Fall nicht erforderlich.
quelle
re
Methode aber nicht schneller?s
,s.find
wird er zurückgegeben-1
. Der Slicing-Operators[begin:end]
akzeptiert ihn als gültigen Index und gibt unerwünschte Teilzeichenfolgen zurück.regulären Ausdruck
Das obige Ist wird mit einem fehlschlagen
AttributeError
Ist wenn keine "AAA" und "ZZZ" vorhanden sindyour_text
Zeichenfolgenmethoden
Das Obige gibt eine leere Zeichenfolge zurück, wenn entweder "AAA" oder "ZZZ" in nicht vorhanden ist
your_text
.PS Python Challenge?
quelle
quelle
AttributeError: 'NoneType' object has no attribute 'groups'
- Wenn es keine AAA gibt, ZZZ in der Zeichenfolge ...Überrascht, dass niemand dies erwähnt hat, was meine Schnellversion für einmalige Skripte ist:
quelle
Sie können nur eine Codezeile verwenden
Ergebnis erhält Liste ...
quelle
Sie können dafür das re- Modul verwenden:
quelle
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
Sie können dasselbe mit
re.sub
Funktionen tun , die denselben regulären Ausdruck verwenden.In Basic Sed wird die Erfassungsgruppe durch dargestellt
\(..\)
, in Python jedoch durch(..)
.quelle
In Python kann das Extrahieren von Teilzeichenfolgen-Formularzeichenfolgen mithilfe der
findall
Methode imre
Modul regulärer Ausdruck ( ) erfolgen.quelle
quelle
quelle
Gibt
quelle
Nur für den Fall, dass jemand das Gleiche tun muss wie ich. Ich musste alles in Klammern in einer Zeile extrahieren. Wenn ich zum Beispiel eine Zeile wie "US-Präsident (Barack Obama) hat sich getroffen mit ..." habe und nur "Barack Obama" erhalten möchte, ist dies eine Lösung:
Dh Sie müssen Klammern mit blockieren
slash \
Vorzeichen . Obwohl es ein Problem mit reguläreren Ausdrücken als Python ist.In einigen Fällen werden möglicherweise auch 'r'-Symbole vor der Regex-Definition angezeigt. Wenn es kein r-Präfix gibt, müssen Sie Escape-Zeichen wie in C verwenden. Hier finden Sie weitere Informationen dazu.
quelle
PyParsing verwenden
was ergibt:
[['1234']]
quelle
Hier ist eine Lösung ohne regulären Ausdruck, die auch Szenarien berücksichtigt, in denen der erste Teilstring den zweiten Teilstring enthält. Diese Funktion findet nur dann einen Teilstring, wenn der zweite Marker hinter dem ersten Marker liegt.
quelle
Eine andere Möglichkeit besteht darin, Listen zu verwenden (vorausgesetzt, der gesuchte Teilstring besteht nur aus Zahlen):
quelle
Ein Liner, der eine andere Zeichenfolge zurückgibt, wenn keine Übereinstimmung vorliegt. Bearbeiten: Verbesserte Version verwendet
next
Funktion,"not-found"
bei Bedarf durch etwas anderes ersetzen :Meine andere Methode, die weniger optimal ist, verwendet das zweite Mal Regex und hat immer noch keinen kürzeren Weg gefunden:
quelle