2016-09-24 1 views
1

Ich bin neu in Python und wurde ziemlich verwirrt beim Lesen der Regex-Dokumentation. Soweit ich weiß, sucht re.search überall in einer Zeichenfolge, während re.match nur den Anfang der Zeichenfolge sucht. Aber wann muss ich re.compile verwenden?Finden Sie das erste bis letzte Alphabet in einer Zeichenfolge

Ich versuchte, mit Regex herumzuspielen, konnte es aber nicht zum Laufen bringen. Wenn eine Zeichenfolge mit Buchstaben, Satzzeichen, Zahlen und Leerzeichen gemischt ist, wie kann ich den Teil der Zeichenfolge mit Alphabeten erhalten?

import re 
a = "123,12 jlkjL kSljdf 12.2" 
test = re.search('^[a-zA-Z]', a) 
print test 

Der Ausgang I zu bekommen versuchen, ist jlkjL kSljdf.

+0

['re.search (r '[a-zA-Z] +', a) .group() .strip()'] (http://ideone.com/EwO0Jb) Fügen Sie dem Zeichen ein Leerzeichen hinzu Klasse und setze einen '+' (1 oder mehr) Quantor darauf. Entfernen Sie die überflüssigen Leerzeichen mit "strip". –

Antwort

1

Sie können re.compile verwenden, um ein Regex-Objekt zu kompilieren, bevor Sie die Regex-Operation verwenden.

Es gibt zwei Möglichkeiten zu ahcieve, was Sie wollen: die Buchstaben mit Leerzeichen passend und dann redundante Leer Strippen oder Entfernen aller nicht-Buchstaben-Symbole von Anfang/Ende:

import re 
a = "123,12 jlkjL kSljdf 12.2" 
rg = re.compile(r'[a-zA-Z ]+') 
mtch = rg.search(a) 
if mtch: 
    print (mtch.group().strip()) # => jlkjL kSljdf 

# Stripping non-letters from the start/end 
rx = re.compile(r'^[^a-zA-Z]+|[^a-zA-Z]+$') 
print(rx.sub('', a)) # => jlkjL kSljdf 

Siehe Python demo

Fügen Sie in der ersten Methode ein Leerzeichen in die Zeichenklasse ein und legen Sie einen + (1 oder mehr Vorkommen) -Quantifizierer darauf fest.

Im zweiten Ansatz entspricht ^[^a-zA-Z]+ 1 oder mehr (+) andere Zeichen als Buchstaben ([^a-zA-Z]) zu Beginn der Zeichenfolge (^) OR (|) 1 oder mehr Zeichen außer Buchstaben am Ende des Strings ($).

+0

Danke, aber ich bin immer noch unklar über den 're.compile' Teil. Warum muss ich das Regex-Objekt kompilieren? Ist 're.compile' hilfreich, um das Ergebnis" nützlich "darzustellen? Weil ich 'print re.search (r '[a-zA-Z] +', a) 'versucht habe, aber es gibt' <_sre.SRE_Match object bei 0x10f7503d8> 'zurück, was in diesem Fall nicht nützlich ist. Im zweiten Ansatz, warum mussten Sie zwei '^' in '^ [^ a-zA-Z] +'? –

+0

Ich füttere jetzt meine Tochter, aber kurz gesagt: 1) ein Regex-Objekt zu kompilieren macht eine Regex-Operation schneller und es ist gut, wenn Sie es oft wiederverwenden müssen, 2) '^' außerhalb der Klammern übereinstimmt der Anfang einer Zeichenkette, 3) negiert die '[^ ..]' die Zeichenklasse, 4) die '.group()' greift auf den Übereinstimmungswert zu, wenn Sie 're.search()' drucken, wird die Übereinstimmung gedruckt * Objekt*. –

Verwandte Themen