Was ist die beste reine Python-Implementierung, um zu überprüfen, ob eine Zeichenfolge ALLE Buchstaben aus dem Alphabet enthält?
string_1 = "(555).555-5555"
string_2 = "(555) 555 - 5555 ext. 5555
Wo string_1
würde False
ich zurückkehren, wenn ich keine Buchstaben des Alphabets darin string_2
hätte, und würde zurückkehren, True
weil ich Buchstaben habe.
Antworten:
Regex sollte ein schneller Ansatz sein:
re.search('[a-zA-Z]', the_string)
quelle
any(c.isalpha() for c in string_1)
ist köstlich Pythonic.isalpha
überhaupt? Dies hat ein völlig anderes Verhalten beim Vergleich von Python 2 mit Python 3. Ist Chinesisch Teil des Alphabets? Wenn nicht, stimmen Sie es blind mit Ihrem Generator auf Python 3 ab (oder Python 2 für Unicode-Strings!). Wenn Sie Pythonic wollen , hier ist es :Simple is better than complex.
. Und überprüfen Sie den obigen Kommentar von OP: Er möchte, dass nur das römische Alphabet übereinstimmt.Match
Objekt, wenn eine Übereinstimmung vorliegt oderNone
nicht. Das ist also mit einemif re.search(...
Muster kompatibel .Wie wäre es mit:
>>> string_1 = "(555).555-5555" >>> string_2 = "(555) 555 - 5555 ext. 5555" >>> any(c.isalpha() for c in string_1) False >>> any(c.isalpha() for c in string_2) True
quelle
set(string_1)
effizienter?set
kann Funktionsaufrufe reduzieren oder nicht, erhöht jedoch den Overhead.Sie können
islower()
Ihre Zeichenfolge verwenden, um festzustellen, ob sie (unter anderem) Kleinbuchstaben enthält.or
es mitisupper()
auch zu überprüfen, ob einige Großbuchstaben enthält:unten: Buchstaben in der Zeichenfolge: Test ergibt true
>>> z = "(555) 555 - 5555 ext. 5555" >>> z.isupper() or z.islower() True
unten: keine Buchstaben in der Zeichenfolge: Test ergibt falsch.
>>> z= "(555).555-5555" >>> z.isupper() or z.islower() False >>>
Nicht zu verwechseln,
isalpha()
wasTrue
nur zurückgibt , wenn alle Zeichen Buchstaben sind, was nicht das ist, was Sie wollen.Beachten Sie, dass Barms Antwort meine gut vervollständigt, da meine den gemischten Fall nicht gut behandelt.
quelle
Ich mochte die Antwort von @ jean-françois-fabre , aber sie ist unvollständig.
Sein Ansatz wird funktionieren, aber nur, wenn der Text nur Klein- oder Großbuchstaben enthält:
>>> text = "(555).555-5555 extA. 5555" >>> text.islower() False >>> text.isupper() False
Der bessere Ansatz besteht darin, zuerst die Zeichenfolge in Groß- oder Kleinbuchstaben zu schreiben und dann zu überprüfen.
>>> string1 = "(555).555-5555 extA. 5555" >>> string2 = '555 (234) - 123.32 21' >>> string1.upper().isupper() True >>> string2.upper().isupper() False
quelle
Sie können reguläre Ausdrücke wie folgt verwenden:
import re print re.search('[a-zA-Z]+',string)
quelle
Ich habe jede der oben genannten Methoden getestet, um festzustellen, ob Alphabete in einer bestimmten Zeichenfolge enthalten sind, und die durchschnittliche Verarbeitungszeit pro Zeichenfolge auf einem Standardcomputer ermittelt.
~ 250 ns für
import re
~ 3 µs für
re.search('[a-zA-Z]', string)
~ 6 µs für
any(c.isalpha() for c in string)
~ 850 ns für
Im Gegensatz zu angeblich dauert das Importieren von re vernachlässigbar lange, und das Suchen mit re dauert nur etwa die Hälfte der Zeit , verglichen mit dem Iterieren von isalpha (), selbst für eine relativ kleine Zeichenfolge.
Daher wäre re für größere Saiten und größere Zählungen wesentlich effizienter.
Aber das Konvertieren eines Strings in einen Fall und das Überprüfen des Falls (dh eines der oberen (). Isupper () oder unteren (). Islower () ) gewinnt hier. In jeder Schleife ist es deutlich schneller als re.search () und erfordert nicht einmal zusätzliche Importe.
quelle
Sie können dies auch zusätzlich tun
import re string='24234ww' val = re.search('[a-zA-Z]+',string) val[0].isalpha() # returns True if the variable is an alphabet print(val[0]) # this will print the first instance of the matching value
Beachten Sie auch, dass, wenn die Variable val None zurückgibt. Das heißt, die Suche hat keine Übereinstimmung gefunden
quelle