Python isupper und islower?

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

DNSxxx 
Fragesteller
 27.11.2020, 17:20

Einzeln hatte ich nicht das Problem. Es geht eher um das mindestens 1 Groß UND 1 Kleinbuchstabe gleichzeitig

0
xxxcyberxxx  27.11.2020, 17:23
@DNSxxx

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
0
alfredo153  27.11.2020, 17:39

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)
1

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.

Woher ich das weiß:Hobby – Hobbyprogrammierer

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.

Woher ich das weiß:Berufserfahrung
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")

DNSxxx 
Fragesteller
 27.11.2020, 17:18

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?

0
KarlRanseierIII  27.11.2020, 17:20
@DNSxxx

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 ;-).

1
DNSxxx 
Fragesteller
 27.11.2020, 17:22

nochaml Danke

0
DNSxxx 
Fragesteller
 27.11.2020, 17:36

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

0
KarlRanseierIII  27.11.2020, 17:48
@DNSxxx

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.

1