Großbuchstaben finden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Malte73
User
Beiträge: 2
Registriert: Sonntag 15. September 2013, 16:24

Hey Leute,
ich möchte mit find() herausfinden, ob es Großbuchstaben in einem Text gibt. Was muss ich in die Klammern schreiben, damit es funktioniert?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Malte73: mit "find" kannst Du nicht herausfinden ob es Großbuchstaben in einem Text gibt. Warum willst Du dafür "find" verwenden?

Code: Alles auswählen

import string
text = "Text mit Grossbuchstaben"
has_uppercase = bool(set(string.uppercase) & set(text))
Malte73
User
Beiträge: 2
Registriert: Sonntag 15. September 2013, 16:24

Ich habe es ausprobiert, da kam die Fehlermeldung: "can't assign to function call"
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Malte73: Was auch immer Du ausprobiert hast, meine drei Zeilen waren es jedenfalls nicht, da beide Assignments auf Namen stattfinden und nicht auf Funktionsaufrufe.
BlackJack

Alternative:

Code: Alles auswählen

text = 'Text mit Grossbuchstaben'
has_uppercase = any(c == c.upper() for c in text)
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Mit upper werden Leerzeichen auch als Großbuchstaben erkannt, besser funktioniert es mit isupper:

Code: Alles auswählen

text = 'Text mit Grossbuchstaben'
has_uppercase = any(c.isupper() for c in text)
sum_of_uppercase = sum(c.isupper() for c in text)
Habe diese Anregung auch in mein Wörterzählprogramm aufgenommen und lasse jetzt die Anzahl der Großbuchstaben damit anzeigen:
http://markush.cwsurf.de/joomla_17/inde ... mit-python
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Malta hat geschrieben:...
Habe diese Anregung auch in mein Wörterzählprogramm aufgenommen und lasse jetzt die Anzahl der Großbuchstaben damit anzeigen:
http://markush.cwsurf.de/joomla_17/inde ... mit-python
Dein Code besitzt aber auch einige Grausamkeiten, mal ein Beispiel:

Code: Alles auswählen

 
        eingabe = eingabe.replace(",", " ")
        eingabe = eingabe.replace(".", " ")
        eingabe = eingabe.replace("-", " ")
        eingabe = eingabe.replace(";", " ")
        eingabe = eingabe.replace(":", " ")
        eingabe = eingabe.replace("!", " ")
        eingabe = eingabe.replace("?", " ")
Du gehst 7x durch die Eingabe!


Oder das hier, würde kein Python Programmierer so machen.

Code: Alles auswählen

def contains(numbers, value):
    for n in numbers:
        if n == value:
            return True
    return False

nums = [1, 2, 3, 7, 13, -2, 4, 8, 9]
result = contains(nums, 7)
print result # True
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@darktrym: wenn das schon eine Grausamkeit ist, was ist dann das Wörterzählen??

Code: Alles auswählen

import re
from collections import Counter

words = re.split('[-.,!\s]+', eingabe)
word_counts = Counter(words)
index = ''.join('{} x {}\n'.format(word_counts[word], word) for word in sorted(word_counts))
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vielleicht solltet ihr auch sagen, was Malta besser machen kann...

Die Alternative für aufeinanderfolgende ``str.replace()``-Aufrufe wäre wohl die Verwendung eines entsprechenden Ausdrucks für ``re.sub()``, damit man das in einem Rutsch erledigen kann.

Die Alternative zu einer selbstgeschriebenen ``contains()``-Funktion ist natürlich die Nutzung des in Python eingebauten ``in``-Operators.

@Sirius3: Worauf genau bezieht sich dein Einwand? Auf ``index``? Gut, das könnte man etwas kompakter schreiben. Mehr sehe ich da jetzt nicht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben:Die Alternative für aufeinanderfolgende ``str.replace()``-Aufrufe wäre wohl die Verwendung eines entsprechenden Ausdrucks für ``re.sub()``, damit man das in einem Rutsch erledigen kann.
Oder der Nutzung von String-Translate, was vermutlich effizienter ist als ne State-Machine für so eine einfache Aufgabe zu verwenden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Danke für euere Tipps insbesondere Sirius3, ich habe die Funktion wie folgt umgeschrieben:

Code: Alles auswählen

        """text analyse and display the analyse"""
        words = re.split('[-.,!\s]+', 
         self.text.get(1.0, 'end').title()[:-1])

        self.wliste.config(state='normal')
        self.windex.config(state='normal')
        self.wliste.delete(1.0, 'end')
        self.windex.delete(1.0, 'end')    

        word_counts = Counter(words)
        liste = "\n".join(words)
        liste += "\n\n Alphabetisch sortiert:\n"
        liste += "\n".join(sorted(words))
        index = ''.join('{} x {}\n'.format(word_counts[word], word)
         for word in sorted(word_counts))
        if words != ['']:
            self.wliste.insert('end', liste)
            self.windex.insert('end', index)
            self.lab["text"] = ("Der Text besteht aus {} Zeichen "
             "und aus {} Wörtern und enthält {} Großbuchstaben"
             .format(sum(c.isalpha() for c in self.text.get(1.0, 'end')),
             len(words), sum(c.isupper() for c in self.text.get(1.0, 'end'))))
        else:
            self.lab["text"] = "Kein Text vorhanden"
        self.windex.config(state='disabled')
        self.wliste.config(state='disabled')
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

"""text analyse and display the analyse"""
Das sind ja gleich zwei Sachen auf einmal... das würde ich trennen und die Analyse-Ergebnisse in einer geeigneten Struktur unterbringen. In einer separaten Funktion kannst Du dann eine hübsch formatierte Ausgabe realisieren. In letzterer würde ich dann auch auf die Templating-Möglichkeiten von Python zurückgreifen und nicht so viel mittels ``+`` konkatenieren.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten