File durchsuchen

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
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

Hallo liebe Python Freunde!

Ich hab vor kurzem mit Pyhton angefangen und bin ganz neu hier. Ich hab jetzt eine Aufgabe, wobei ich ein File durchsuchen muss.
Ich soll einen kleinen Buchstaben finden wo links und rechts jeweils 3 Großbuchstaben sind.
Meine Idee ist es alles in eine Liste zu machen und dann nach den Kleinbuchstaben zu suchen.
Soweit funktioniert das auch. Aber geht es auch, dass ich sage and dem Index von dem gefundenen Buchstaben +3 und - 3 müssen Großbuchstaben sein? Oder gibt es einen einfacheren Weg?
Ich hoffe Ihr versteht was ich meine.
Hier ist mein Code bisher!
Ich möchte nicht gleich die Lösung, sondern Hinweise wie ich das lösen kann. Ich möchte da selbst dran rum probieren, aber gerade komme ich einfach nicht weiter!

Code: Alles auswählen

"""with open("BigBodyguards.txt", "w") as my_file:
    pass"""
def bigbodyguards():
    with open("BigBodyguards.txt", "r") as my_file:
        new = []
        for lines in my_file:
            for ch in lines:
                new.append(ch)
        llist = []
        for l in new:
            llist.append(l)

        new_list = []
        for i in llist:
            if i == i.lower():
                print i
                #new_list.append(llist.index(i))
    return new_list


print bigbodyguards()
Vielen Dank im Vorraus.
Zuletzt geändert von Anonymous am Mittwoch 15. Februar 2017, 17:08, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Das klingt nach http://www.pythonchallenge.com/ Level 3 und wird üblicherweise mit dem `re`-Modul gelöst.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@t3c404: Auf Stringelemente kann man ähnlich wie auf Listenelemente zugreifen. Daher ist die Umkopiererei nicht nötig (man würde auch extend statt einer for-Schleife mit append verwenden). Was ist der Zweck des zweiten Kopierens in llist? Zum Suchen von Kleinbuchstaben: es gibt str.islower das prüft, ob ein String nur aus Kleinbuchstaben besteht. Wenn Du zusätzlich einen Index in einer for-Schleife brauchst, nimm enumerate.

Zur Namensgebung: Variablennamen sollten sagen, für was die Variable gebraucht wird. Den Typ mit kyptischen Zusätzen anzugeben ist da wenig erhellend.
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

@BlackJack
Ganz genau und vielen Dank. Werde ich mal schauen wie das funktioniert.

@Sirius3:
Das kopieren in die zweite Liste war deshalb, weil ich Probleme mit den Zeilenumbrüchen hatter beim durchsuchen.
Der "Text" besteht aus lauter Groß- und Kleinbuchstaben. Deswegen wird str.islower() nichts nutzen.
Das mit enumerate hatte ich ganz vergesse :/

Vielen Dank an euch beide für die schnelle Antwort.
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

Also ich hab meinen Code mal überarbeitet, bzw. neu geschrieben und hab da noch ne Frage dazu.
Hier erstmal der Code.

Code: Alles auswählen

import re

"""with open("BigBodyguards.txt", "w") as my_file:
    pass"""
def bigbodyguards():
    with open("BigBodyguards.txt", "r") as my_file:
        text = []
        for line in my_file:
            for letter in line:
                text.append(letter)
            text_string = "".join(text)
            match = re.search(r'[a-z][A-Z][A-Z][A-Z][a-z][A-Z][A-Z][A-Z][a-z]', text_string)
            #match = re.search(r'[A-Z]', text_string)
    return match.group()

print bigbodyguards()
1. Ich hab auch ein Match gefunden, allerdings bin ich mir nicht sicher ob das so stimmt.
2. Wenn ich jetzt nach etwas anderem suche, z.B. match = re.search(r'[A-Z][A-Z][A-Z]', text_string), dann bekomme ich nur 1 Match. Bricht er hier beim ersten Match ab? Wenn ja, wie kann ich das umgehen, dass er mir alle Treffer in dem Text ausgibt?

Grüße

t3c404
Zuletzt geändert von Anonymous am Donnerstag 16. Februar 2017, 11:36, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

1: [A-Z][A-Z][A-Z] kann man auch als [A-Z]{3} schreiben.
2: Es gibt auch re.findall.
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

/me hat geschrieben:1: [A-Z][A-Z][A-Z] kann man auch als [A-Z]{3} schreiben.
2: Es gibt auch re.findall.
Vielen Dank!
Es hat funktioniert :)
Also in das Reguläre Ausdrücke muss ich mich gut einarbeiten.

Hier meine Lösung:

Code: Alles auswählen

import re

"""with open("BigBodyguards.txt", "w") as my_file:
    pass"""
def bigbodyguards():
    with open("BigBodyguards.txt", "r") as my_file:
        text = []
        for line in my_file:
            for letter in line:
                text.append(letter)
            text_string = "".join(text)
            match = re.findall(r'[a-z][A-Z]{3}[a-z][A-Z]{3}[a-z]', text_string)
            #match = re.search(r'[A-Z]', text_string)
    return match

print bigbodyguards()
Vielen Dank an alle :)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@t3c404: Deine Eintrückungen sind falsch.

Code: Alles auswählen

def bigbodyguards():
    with open("BigBodyguards.txt", "r") as my_file:
        text = []
        for line in my_file:
            for letter in line:
                text.append(letter)
    text_string = "".join(text)
    match = re.findall(r'[a-z][A-Z]{3}[a-z][A-Z]{3}[a-z]', text_string)
    return match
Dann kann man extend benutzen: text.extend(line). Was aber auch noch zu umständlich ist, weil man auch einfach read verwenden könnte:

Code: Alles auswählen

def bigbodyguards():
    with open("BigBodyguards.txt", "r") as my_file:
        text_string = my_file.read()
    return re.findall(r'[a-z][A-Z]{3}[a-z][A-Z]{3}[a-z]', text_string)
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Ohne reguläre Ausdrücke zu benutzen, um deinen ursprünglichen Ansatz fortzuführen, solltest du dir enumerate() anschauen.

Somit hast du in der Schleife nicht nur den einzelnen Buchstaben, sondern auch seinen Index, und kannst auf benachbarte Buchstaben zugreifen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

@ Sirius3: Danke, hab es geändert. Hat aber trotz der falschen Einrücckung trotzdem funktioniert, aber ich weiß warum die falsch ist.
text_string = my_file.read() ist natürlich einfacher.

@ Kebap: Werde ich mal probieren. Vielen Dank.
Antworten