Hur tar jag ut specifika portioner i en textfil med Python?

Att extrahera text från en fil är en vanlig uppgift i skript och programmering, och Python gör det enkelt. I den här guiden diskuterar vi några enkla sätt att extrahera text från en fil med Python 3-programmeringsspråket.

I den här guiden använder vi Python version 3. De flesta system kommer förinstalleras med Python 2.7. Medan Python 2.7 används i de flesta arvskoder är Python 3 nuvarande och framtid för Python-språket. Om du inte har en specifik anledning att skriva eller stödja äldre Python-kod rekommenderar vi att du arbetar i Python 3.

För Microsoft Windows kan Python3 laddas ner från //www.python.org. När du installerar, se till att alternativet "Install launcher for all users" och "Add Python to PATH" är båda markerade, vilket visas i bilden nedan.

På Linux kan du installera Python 3 med din pakethanterare. Till exempel, på Debian eller Ubuntu kan du installera det med kommandot:

 sudo apt-get uppdatering && sudo apt-get install python3 

För MacOS kan Python 3 installatören hämtas från python.org, som länkat ovan. Om du använder Homebrew-pakethanteraren kan den också installeras genom att öppna ett terminalfönster ( ProgramVerktyg ) och köra det här kommandot:

 brygga installation python3 

Running Python

På Linux och MacOS är kommandot att köra Python 3 tolk python3 . I Windows, om du installerade startprogrammet, är kommandot py . Kommandon på denna sida använder python3 ; Om du är på Windows, ersätt py för python3 i alla kommandon.

Kör Python utan några alternativ startar den interaktiva tolken. För mer information om hur du använder tolken, se Python översikt: med hjälp av Python tolken. Om du av misstag kommer in i tolken kan du avsluta den med kommandotrycket () eller avsluta () .

Att köra Python med ett filnamn tolkar det pythonprogrammet. Till exempel:

 python3 program.py 

... kör programmet som finns i filen program.py .

Okej, hur kan vi använda Python för att extrahera text från en textfil?

Läser data från en textfil

Låt oss först läsa en textfil. Låt oss säga att vi arbetar med en fil med namnet lorem.txt, som innehåller några rader latin:

 Lorem ipsum dolor sit amet, consectetur adipiscing elit.Mauris inte maximus purus. Maecenas sitter amet pretium tellus. 

Quisque hos dignissim lacus.

Obs! I alla exemplen som följer arbetar vi med text i den här filen. Känn dig fri att kopiera och klistra in latintexten ovan i en textfil och spara den som lorem.txt, så att du kan köra exempelkoden med den här filen som inmatning.

Ett Python-program kan läsa en textfil med hjälp av den inbyggda öppna () -funktionen. Till exempel nedan är ett Python 3-program som öppnar lorem.txt för läsning i textläge, läser innehållet i en strängvariabel som heter innehållet, stänger filen och trycker sedan ut data.

 myfile = open ("lorem.txt", "rt") # öppen lorem.txt för läsning av textinnehåll = myfile.read () # läs hela filen i en sträng myfile.close () # stäng filutskriften (innehåll) # utskriftsinnehåll 

Här är myfile det namn vi ger till vårt filobjekt.

Parametern " rt " i funktionen öppen () betyder "vi öppnar den här filen för att få e-postdata"

Hash-märket (" # ") betyder att allt på resten av den raden är en kommentar, och den ignoreras av Python-tolken.

Om du sparar det här programmet i en fil som heter read.py kan du köra den med följande kommando.

 python3 read.py 

Kommandot ovan anger innehållet i lorem.txt :

 Lorem ipsum dolor sit amet, consectetur adipiscing elit.Mauris inte maximus purus. Maecenas sitter amet pretium tellus. 

Quisque hos dignissim lacus.

Använda "med öppna"

Det är viktigt att stänga dina öppna filer så snart som möjligt: ​​Öppna filen, utför din operation och stäng den. Lämna inte den öppen under längre perioder.

När du arbetar med filer är det bra att använda den med öppna ... som sammansatt uttalande. Det är det renaste sättet att öppna en fil, fungera på den och stänga filen, allt i ett lättläst kodkod. Filen stängs automatiskt när kodblocket är klar.

Används med öppet ... som vi kan skriva om vårt program så att det ser ut så här:

 med öppen ('lorem.txt', 'rt') som myfile: # Öppna lorem.txt för att läsa textinnehåll = myfile.read () # Läs hela filen i ett strängutskrift (innehåll) # Skriv ut strängen 

Obs! Indragning är viktigt i Python. Python-program använder vitt utrymme i början av en rad för att definiera räckvidd, t.ex. ett block av kod. Det rekommenderas att du använder fyra mellanslag per inryckningsnivå, och att du använder mellanslag snarare än flikar. I följande exempel ser du till att din kod är indragad exakt som den presenteras här.

Spara programmet som read.py och kör det:

 python3 read.py 

Produktion

 Lorem ipsum dolor sit amet, consectetur adipiscing elit.Mauris inte maximus purus. Maecenas sitter amet pretium tellus. 

Quisque hos dignissim lacus.

Läser textfiler linje för rad

I exemplen hittills har vi läst i hela filen på en gång. Att läsa en fullständig fil är inte så stor med små filer, men i allmänhet är det inte en bra idé. För en sak, om din fil är större än mängden tillgängligt minne kommer du att stöta på ett fel.

I nästan alla fall är det en bättre idé att läsa en textfil en rad i taget.

I Python är filobjektet en iterator. En iterator är en typ av Python-objekt som uppträder på vissa sätt när det används flera gånger. Du kan till exempel använda en för-slinga för att fungera på ett filobjekt flera gånger, och varje gång samma operation utförs får du ett annat eller "nästa" resultat.

För textfiler repeterar filobjektet en rad text i taget. Det betraktar en rad text som en "enhet" av data, så vi kan använda en för ... i loop-uttalandet för att iterera på data en rad i taget:

 med öppen ('lorem.txt', 'rt') som myfile: # Öppna fillorem.txt för att läsa text för myline i myfile: # För varje rad, läs den till ett strängutskrift (myline) # skriv den strängen, upprepa 

Produktion

 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris nec maximus purus. Maecenas sitter amet pretium tellus. Quisque hos dignissim lacus. 

Observera att vi får en extra radbrytning ("newline") efter varje rad. Det beror på att två nya linjer skrivs ut. Den första är newline i slutet av varje rad i vår textfil. Den andra nya raden händer för att, som standard, skriv ut () lägger till en linjeprofil av sig själv i slutet av vad du än har bett att skriva ut.

Låt oss lagra våra textrader i en variabel - speciellt en listvariabel - så vi kan titta närmare på det.

Lagring av textdata i en listvariabel

I Python liknar listor, men inte samma som, en array i C eller Java. En Python-lista innehåller indexerad data, av olika längder och typer.

 mylines = [] # Förklara en tom lista med namnet mylines. med öppen ('lorem.txt', 'rt') som myfile: # Öppna lorem.txt för att läsa textdata. för myline i myfile: # För varje rad, lagrad som myline, mylines.append (myline) # lägg till dess innehåll till mylines. print (mylines) # Skriv ut listan. 

Utgången av detta program är lite annorlunda. I stället för att skriva ut innehållet i listan skriver detta program vårt listobjekt ut som ser ut så här:

Produktion

 ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc fringilla arcu congue medus aliquam mollis. \ N ", " Mauris nec maximus purus. Maecenas sitter amet pretium tellus. Pröva sed rhoncus eo. Duis id commodo orci. \ N ", " Quisque hos dignissim lacus. \ N "] 

Här ser vi det råa innehållet i listan. I dess råa objektform visas en lista som en kommandorad lista. Här representeras varje element som en sträng, och varje ny linje är representerad som sin escape-teckensekvens, \ n .

På samma sätt som en array i C eller Java kan vi komma åt elementen i en lista genom att ange ett indexnummer efter variabelnamnet inom parentes. Indexnummer börjar vid noll - andra ord, n : n elementet i en lista har numeriskt index n -1.

Obs! Om du undrar varför indexnummer börjar vid noll istället för en, är du inte ensam. Datavetenskapare har diskuterat användbarheten av nollbaserade numreringssystem tidigare. År 1982 gav Edsger Dijkstra sin åsikt om ämnet och förklarade varför nollbaserad numrering är det bästa sättet att indexera data i datavetenskap. Du kan läsa notatet själv - han gör ett övertygande argument.

Vi kan skriva ut det första elementet av rader genom att ange indexnummer 0, som finns i parentes efter namnet på listan:

 print (mylines [0]) 

Produktion

 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc fringilla arcu congue metus aliquam mollis. 

Eller den tredje raden, genom att ange indexnummer 2:

 print (mylines [2]) 

Produktion

 Quisque hos dignissim lacus. 

Men om vi försöker komma åt ett index för vilket det inte finns något värde, får vi ett fel:

 print (mylines [3]) 

Produktion

 Traceback (senaste samtal senast): Fil, rad, i tryck (mylines [3]) IndexError: lista index utanför intervallet 

Ett listobjekt är en iterator, så att skriva ut varje element i listan kan vi iterera över det med för ... i :

 mylines = [] # Förklara en tom lista med öppen ('lorem.txt', 'rt') som myfile: # Öppna lorem.txt för att läsa text. för rad i myfile: # För varje rad text, mylines.append (linje) # lägg till den raden i listan. för element i mylines: # För varje element i listan, skriv ut (element) # skriv ut det. 

Produktion

 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris nec maximus purus. Maecenas sitter amet pretium tellus. Quisque hos dignissim lacus. 

Men vi får fortfarande extra nya linjer. Varje rad i vår textfil slutar i en ny linje karaktär (' \ n ') som skrivs ut. Dessutom, efter att ha skrivit ut varje rad, lägger ut () till en ny linje, om inte du berättar att den ska göra något annat.

Vi kan ändra detta standardbeteende genom att ange en slutparameter i vårt utskrift () -samtal:

 skriva ut (element, slutet = '') 

Genom att ställa in slutet på en tom sträng (representerad som två enkla citat, utan mellanrum), berättar vi för att skriva ut () för att skriva ut ingenting i slutet av en rad istället för en ny linje.

Vårt reviderade program ser så här ut:

 mylines = [] # Förklara en tom lista med öppen ('lorem.txt', 'rt') som myfile: # Öppna fillorem.txt för att läsa text för rad i myfile: # För varje rad text, mylines.append ( linje) # lägg till den raden i listan. för element i mylines: # För varje element i listan, skriv ut (element , slutet = '' ) # skriv ut det , utan extra nya linjer . 

Produktion

 Lorem ipsum dolor sit amet, consectetur adipiscing elit.Mauris inte maximus purus. Maecenas sitter amet pretium tellus. 

Quisque hos dignissim lacus.

De nya linjerna du ser här finns faktiskt i filen. De är ett specialtecken (' \ n ') i slutet av varje rad. Vi vill bli av med dessa, så vi behöver inte oroa dem när vi bearbetar filen.

Hur man tar bort nya linjer

För att ta bort newlines helt kan vi ta bort dem. Att radera en sträng är att ta bort en eller flera tecken, vanligtvis blanksteg, från början eller slutet av strängen.

Tips: Denna process kallas ibland också "trimning".

Python 3-strängobjekt har en metod som heter rstrip (), som spårar tecken från höger sida av en sträng. Det engelska språket läser från vänster till höger, så avlägsnande från höger sida tar bort tecken från slutet.

Om variabeln heter mystring kan vi ta bort sin högra sida med mystring.rstrip ( chars ), där tecken är en sträng av tecken att stripa om de finns på högra sidan av strängen. Till exempel returnerar "123abc" .rstrip ("bc") 123a .

Tips: När du representerar en sträng i ditt program med dess bokstavliga innehåll kallas det en sträng bokstavlig. I Python (som i de flesta programmeringsspråk) citeras strängbokstäver alltid - bifogade på båda sidor med enkla (') eller dubbla (") citat. I Python är singel- och dubbelnoteringar ekvivalenta, du kan använda den ena eller den andra, så länge de matchar i båda ändarna av strängen. Det är traditionellt att representera en mänskligt läsbar sträng (som Hello ) i dubbla citat ( "Hello" ). Om du representerar ett enda tecken (t.ex. b ) eller ett enskilt specialtecken, t.ex. Newline-tecknet ( \ n ), är det traditionellt att använda enskilda citat ( 'b', '\ n' ). För mer information om hur man använder strängar i Python kan du läsa dokumentationen av strängar i python

Uttalingssträngen .rstrip ('\ n') kommer att ta bort en ny linje från höger sida av strängen . Följande version av vårt program remsor nya linjer när varje rad läses från textfilen:

 mylines = [] # Förklara en tom lista. med öppen ('lorem.txt', 'rt') som myfile: # Öppna lorem.txt för att läsa text. för myline i myfile: # För varje rad i filen, mylines.append (myline.rstrip ('\ n')) # strip newline och lägg till i listan. för element i mylines: # För varje element i listan, skriv ut (element) # skriv ut det. 

Texten lagras nu i en listvariabel, så enskilda linjer kan nås med indexnummer. Newlines har tagits bort, så vi behöver inte oroa dem. Vi kan alltid sätta tillbaka dem senare om vi rekonstruerar filen och skriver den till disken.

Låt oss nu leta efter raderna i listan för en viss substring.

Låt oss säga att vi vill hitta varje förekomst av en viss fras, eller till och med en enkla bokstav. Till exempel kanske vi behöver veta var var och en "e" är. Vi kan åstadkomma detta med hjälp av strängens find () -metod.

Listan lagrar varje rad i vår text som ett strängobjekt. Alla strängobjekt har en metod, find (), som lokaliserar den första förekomsten av en substräng i strängen.

Låt oss använda metoden find () för att söka efter bokstaven "e" i första raden i vår textfil, som lagras i listan mylines . Det första elementet i myliner är ett strängobjekt som innehåller den första raden i textfilen. Detta strängobjekt har en find () -metod.

I parentesen i find () anger vi parametrar. Den första och enda nödvändiga parametern är strängen att söka efter, "e" . Uttrycket mylines [0] .find ("e") berättar tolken att börja i början av strängen och söka framåt, ett tecken åt gången tills det hittar brevet "e." När den hittar en, slutar den att söka och returnerar indexnumret där det "e" är beläget. Om den når slutet av strängen, returnerar den -1 för att indikera att inget hittades.

 trycket (mylines [0] .Hitta ( "e")) 

Produktion

3

Returvärdet "3" berättar att bokstaven "e" är det fjärde tecknet, "e" i "Lorem". (Kom ihåg att indexet är nollbaserat: index 0 är det första tecknet, 1 är den andra etc.)

Metoden find () innehåller två valfria, ytterligare parametrar: ett startindex och ett stoppindex, vilket anger var i strängen sökningen bör börja och sluta. Exempelvis sträng .find ("abc", 10, 20) söker efter substring "abc", men endast från 11: e till 21: e tecken. Om stopp inte anges, hittar () start vid indexstart och slutar i slutet av strängen.

Exempelvis söker följande uttalande för "e" i mylines [0], som börjar vid den femte tecknen.

 skriva ut (mylines [0] .find ("e", 4)) 

Produktion

 24 

Med andra ord, med början på 5: e tecken i rad [0] ligger den första "e" i index 24 ("e" i "nek").

För att börja söka på index 10, och sluta med index 30:

 skriv ut (mylines [1] .find ("e", 10, 30)) 

Produktion

 28 

(Den första "e" i "Maecenas").

Om hitta () inte hittar substriktet i sökområdet, kommer det att returnera numret -1, vilket indikerar fel:

 skriv ut (mylines [0] .find ("e", 25, 30)) 

Produktion

-1

Det fanns inga "e" förekomster mellan index 25 och 30.

Hitta alla förekomster av en substring

Men vad händer om vi vill hitta varje förekomst av en substring, inte bara den första vi stöter på? Vi kan iterera över strängen, med början från indexet för föregående match.

I det här exemplet använder vi en stundslinga för att upprepade gånger hitta bokstaven "e". När en händelse hittas kallas vi igen, från en ny plats i strängen. Specifikt läget för den senaste händelsen plus längden på strängen (så vi kan gå vidare förbi den sista). När hitta returnerar -1, eller startindexet överskrider strängens längd, slutar vi.

 # Bygg myliner som visas ovan mylines = [] # Förklara en tom lista. med öppen ('lorem.txt', 'rt') som myfile: # Öppna lorem.txt för att läsa text. för myline i myfile: # För varje rad i filen, mylines.append (myline.rstrip ('\ n')) # strip newline och lägg till i listan. # Sök och skriv alla händelser av bokstav "e" index = 0 # nuvarande index prev = 0 # föregående index str = mylines [0] # sträng som ska sökas (första elementet i mylines) substr = "e" # substring för att söka efter medan index = len (str)) print ('\ n' + str); # Skriv ut den ursprungliga strängen under e-posten 

Produktion

 eeeee Lorem ipsum dolor sit amet, consectetur adipiscing elit. ee Nunc fringilla arcu congue metus aliquam mollis. 

Innehåller reguljära uttryck

För komplexa sökningar bör du använda vanliga uttryck.

Pythons reguljära uttrycksmodul heter re . För att använda den i ditt program, importera modulen innan du använder den:

 import re 

Re- modulen implementerar reguljära uttryck genom att sammanställa ett sökmönster i ett mönsterobjekt. Metoder för detta objekt kan sedan användas för att utföra matchningsoperationer.

Låt oss till exempel säga att du vill söka efter något ord i ditt dokument som börjar med bokstaven d och slutar i bokstaven r . Vi kan uppnå detta med det vanliga uttrycket " \ bd \ w * r \ b ". Vad betyder det här?

teckenföljdmenande
\ bEtt ordgräns matchar en tom sträng (något, inklusive ingenting alls), men bara om det förekommer före eller efter ett ord som inte är ordet. "Ordtecken" är siffrorna 0 till 9, små bokstäver och stora bokstäver eller ett understreck (" _ ").
dLiten bokstav d .
\ w *\ w representerar varje ordtecken och * är en kvantifierande betydelse som betyder "noll eller mer av föregående tecken". Så \ w * kommer att matcha noll eller flera ordtecken.
rLiten bokstav r .
\ bOrdgräns.

Så det här reguljära uttrycket matchar alla strängar som kan beskrivas som "ett ordgräns, då en liten bokstav" d ", då noll eller flera ordtecken, sedan en liten bokstav" r ", då ett ordgräns." strängar som kan beskrivas på detta sätt inkluderar orden förstörare, dour och doktor och förkortningen dr .

För att använda detta reguljära uttryck i Python-sökoperationer sammanställer vi först det till ett mönsterobjekt. Till exempel skapar följande Python-ståndpunkt ett mönsterobjekt som heter mönster som vi kan använda för att utföra sökningar med det reguljära uttrycket.

 mönster = re.compile (r "\ bd \ w * r \ b") 

Obs! Brevet r före strängen i ovanstående uttalande är viktigt. Det berättar Python att tolka vår sträng som en rå sträng, precis som vi har skrivit den. Om vi ​​inte prefixar strängen med en r, skulle Python tolka flyktsekvenserna som \ b på andra sätt. När du behöver Python för att tolka dina strängar bokstavligen, ange den som en rå sträng genom att prefixa den med r .

Nu kan vi använda mönsterobjektets metoder, till exempel sökning () för att söka efter en sträng för det sammanställda regelbundna uttrycket, letar efter en match. Om den hittar en kommer det att returnera ett speciellt resultat som heter ett matchobjekt. Annars returnerar den Ingen, en inbyggd Python-konstant som används som det booleska värdet "false".

Exempel

 import re str = "God morgon, läkare." pat = re.compile (r "\ bd \ w * r \ b") # kompilera regex "\ bd \ w * r \ b" till ett mönsterobjekt om pat.search (str)! = Ingen: # Sök efter mönster. Om det hittades, skriv ut ("Hittade det.") 

Produktion

 Hittade det 

För att utföra en obestämd sökning kan du ange specialkonstant re.IGNORECASE i kompileringssteget:

 import re str = "Hej, DoctoR." pat = re.compile (r "\ bd \ w * r \ b", re.IGNORECASE) # Övre och små bokstäver matchar om pat.search (str)! = None: print ("Found it.") 

Produktion

 Hittade det 

Få alltid att falla på plats

Så nu vet vi hur man öppnar en fil, läser raderna i en lista och hittar en substring i ett visst element i den listan. Låt oss använda denna kunskap för att bygga några exempelprogram.

Skriv ut alla linjer som innehåller substring

Programmet nedan läser en loggfilslinje för rad. Om raden innehåller ordet "fel" läggs det till i en lista som heter fel . Om inte, ignoreras det. Den lägre () strängmetoden omvandlar alla strängar till små bokstäver för jämförelseändamål, vilket gör sökningen okänslig utan att ändra de ursprungliga strängarna.

Observera att metoden find () kallas direkt på resultatet av den lägre () -metoden. detta kallas metodkedja . Observera också att i utskriften () -satsen konstruerar vi en utdatasträng genom att ansluta flera strängar med + -operatören.

 fel = [] # Listan där vi ska lagra resultat. linenum = 0 substr = "error" .lower () # Substring att söka efter. med öppet ('logfile.txt', 'rt') som myfile: för rad i myfile: linne + = 1 om line.lower (). hitta (substr)! = -1: # om otillräcklig match, fel. lägg till ("Linje" + str (linne) + ":" + line.rstrip ('\ n')) för fel i fel: Skriv ut (err) 

Produktion

 Rad 6: mar 28 09:10:37 Fel: kan inte kontakta servern. Anslutning vägrade. Linje 10: mar 28 10:28:15 Kärnfel: Den angivna platsen är inte monterad. Linje 14: mar 28 11:06:30 ERROR: usb 1-1: kan inte ställa in config, exiting. 

Extrahera alla linjer som innehåller substring, med hjälp av regex

Programmet nedan liknar det ovanstående programmet, men använder re- reguljära uttrycksmodulen. Fel och linjenummer lagras som tuples, t ex (linne, linje). Tupeln skapas av de ytterligare omslutna parenteserna i fönstret errors.append () . Tupelens element är refererade till en lista, med ett nollbaserat index inom parentes. Som konstruerad här är err [0] ett linne och fel [1] är den tillhörande raden som innehåller ett fel.

 import re error = [] linne = 0 pattern = re.compile ("error", re.IGNORECASE) # Kompilera en obestämlig regex med öppen ('logfile.txt', 'rt') som myfile: för rad i myfile : linne + = 1 om pattern.search (linje)! = Ingen: # Om en matchning hittas errors.append ((linum, line.rstrip ('\ n'))) för fel i fel: # Iterate över listan av "tuples print" ("Linje" + str (err [0]) + ":" + err [1]) 

Utgång (samma som ovan)

 Rad 6: mar 28 09:10:37 Fel: kan inte kontakta servern. Anslutning vägrade. Linje 10: mar 28 10:28:15 Kärnfel: Den angivna platsen är inte monterad. Linje 14: mar 28 11:06:30 ERROR: usb 1-1: kan inte ställa in config, exiting. 

Extrahera alla rader som innehåller ett telefonnummer

Programmet nedan skriver ut en rad i en textfil, info.txt, som innehåller ett amerikanskt eller internationellt telefonnummer. Det åstadkommer detta med det vanliga uttrycket " (\ + \ d {1, 2})? [\ S .-]? \ D {3} [\ s .-]? \ D {4} ". Denna regex matchar följande telefonnummer noteringar:

  • 123-456-7890
  • (123) 456-7890
  • 123 456 7890
  • 123.456.7890
  • +91 (123) 456-7890
 importera refel = [] linum = 0 mönster = re.compile (r "(\ + \ d {1, 2})? [\ s .-]? \ d {3} [\ s .-]? \ d {4} ") med öppen ('info.txt', 'rt') som myfile: för rad i myfile: linne + = 1 om pattern.search (rad)! = Ingen: # Om mönstersökning hittar en match, .append ((linne, line.rstrip ('\ n'))) för fel i fel: skriv ut ("Linje", str (err [0]), ":" + err [1]) 

Produktion

 Rad 3: Mitt telefonnummer är 731.215.8881. Linje 7: Du kan nå mr Walters på (212) 558-3131. Linje 12: Hans agent, fru Kennedy, kan nås på +12 (123) 456-7890 Linje 14: Hon kan också kontaktas på (888) 312.8403, förlängning 12. 

Sök i ordbok för ord

Programmet nedan söker i ordlistan för ord som börjar med h och slutar i pe . För inmatning använder den en ordboksfil som ingår i många Unix-system, / usr / share / dict / words .

 importera filnamn = "/ usr / share / dict / words" pattern = re.compile (r "\ bh \ w * pe $", re.IGNORECASE) med öppet (filnamn, "rt") som myfile: myfile: om pattern.search (linje)! = None: print (line, end = '') 

Produktion

 Hoppas heliotropa hopp hornpipe horoskop hype