Python isupper und islower?
Ich möchte herausfinden ob mindestens ein Klein- und ein Großbuchstabe im String ist.
Mein bisheriger (Falscher) Code:
s = 'passwort_1'
if s.isupper and s.islower:
print('ja')
else:
print('nein')
Wie kann ich das schreiben das ich "ja" bekomme wenn mindestens 1 Groß- und mindestens 1 Kleinbuchstabe im String ist, und ich "nein" bekomme wenn nicht beides zutrifft, bzw. im String ist?
5 Antworten
Mit einer Schleife ...
Du kannst das durch List Lomprehension als Einzeiler schreiben - wenn s der Name des Strings ist:
# Überprüft, ob es mindestens einen Kleinbuchstaben gibt
if any(c for c in s if c.islower()):
pass
# Überprüft, ob es mindestens einen Großbuchstaben gibt
if any(c for c in s if c.isupper())):
pass
Den Ausdruck kann man einen Hauch kompakter und m.E. logischer schreiben, ohne die "truthiness" von Buchstaben auszunutzen:
any(c.islower() for c in s)
dann verknüpf beides doch mit einem und?
oder, um es umzudrehen - sei das erste mal a, das zweite b
a = any(c for c in s if c.islower())
b = any(c for c in s if c.isupper())
if not a or not b:
# Passwort enthält keine Großbuchstaben oder keine Kleinbuchstabem
else:
# do stuff
Vergleiche doch mit einer Variante des Strings, bei der alle Zeichen in Groß-/Kleinbuchstaben umgewandelt wurden.
word = 'abc'
if word != word.upper():
print("Has at least one lowercase letter")
if word != word.lower():
print("Has at least one uppercase letter")
upperCounter =0
lowerCounter =0
s = 'passwort_1'
for letter in s:
if letter.isUpper:
upperCounter +=1
else:
lowerCounter +=1
if lowerCounter >=1 and upperCounter >= 1:
print('ja')
else:
print('nein')
Hiermit benutzt du eine Schleife um jeden Buchstaben im String s einmal durchzugehen und zählst die Anzahl von Klein -und Großbuchstaben.
Eine if-Abfrage am Ende und da ist der Code.
Anstatt "islower()" bzw. "isupper()", kannst du lieber "lower()" und "upper()" nutzen:
for pw in ('foo', 'BAR', 'bAz'):
print(pw, end=': ')
if pw != pw.lower() and pw != pw.upper():
print('OK!')
else:
print('Aahhh!')
Die Ausgabe sieht dann so aus:
foo: Aahhh!!!
BAR: Aahhh!!!
bAz: OK!
Ich denke, das dürfte die kürzeste und eleganteste Lösung sein, ohne unnötige Schleifen.
if not s.isupper() and not s.islower():
Sollte den Job erledigt bekommen.
Nachtrag einfacher wäre es umzudrehen:
if s.isupper() or s.islower():
print("Not mixed Case")
Das mit or hab ich wahrscheinlich falsch verstanden, weil das funktioniert bei meinem Fall nicht.
passwort_1 = 'passo'
passwort_2 = 'Passwort_1'
passwort_3 = 'passwort_1'
def p_qual(s):
punkte = 0
if len(s) <= 7:
print("Das Passwort hat ", punkte, " erreicht!")
return punkte
else:
punkte = 1
print("Das Passwort hat ",punkte, "Punkt erreicht, weil es mindestens 8 Zeichen hat!")
if s.isupper() or s.islower():
punkte += 1
print("Das Passwort hat ",punkte, "Punkt erreicht!")
return punkte
print('p1')
p_qual(passwort_1)
print('p2')
p_qual(passwort_2)
print('p3')
p_qual(passwort_3)
Aber die variante mit not versteh ich und funktioniert.
Thanks a lot
Bei OR wird es true, wenn nur Klein- oder Großbuchstaben vorhanden isnd, also genau den Fall, den Du schlechter bewerten möchtest, entsprechen würdest DU ein not voranstellen, oder eben die Punkte im ELSE-Zweig vergeben.
!a and !b == !! (!a and !b) == !(a or b).
Ohne das NOT außerhalb der Klammer wird wie gesagt der umgekehrte Fall genommen und die beiden Zweige des IF wechseln ihre Rolle.
Aber mache es so, wie Du möchtest und verstehst, sodaß es funktioniert.
Verstehe ich das richtig?
Wenn nicht alles Großgeschrieben ist
und
nicht alles Kleingeschrieben ist
wird True ausgegeben.
Sonderzeichen und Leerzeichen interessiert die beiden Funktionen nicht.
Hab ich das richtig verstanden, weil dann ist das der einfachste weg?
Japp, die Methode betrachtet nur Zeichen, die einen Case haben können.
Die Variante mit or ist etwas griffiger in meinen Augen, die könnte man auch mit vorangestelltem not machen, müßte dann aber Klammern.
| islower(self, /)
| Return True if the string is a lowercase string, False otherwise.
|
| A string is lowercase if all cased characters in the string are lowercase and
| there is at least one cased character in the string.
Dreist aus der Online-Hilfe geklaut ;-).
Einzeln hatte ich nicht das Problem. Es geht eher um das mindestens 1 Groß UND 1 Kleinbuchstabe gleichzeitig