Hoe specifiek stuk tekst zoeken en opslaan

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Jokiehints
  • Registratie: Februari 2019
  • Laatst online: 02-04-2024
Ik ben een script aan het schrijven waarin ik in staat ben om een specifiek stuk tekst te zoeken in een txt bestand en dit vervolgens te schrijven in een ander txt bestand. Ik gebruik de namen: 'f1' en 'f2'. In het 'f1' bestand staan verschillende tekstdelen die een begin en eind marker hebben. De begin marker is variabel: bijvoorbeeld "* 1", "*2", of "* 3". De eind marker is steeds een enkele asterix ("*"). Het is nu de bedoeling als de variabele begin marker bijvoorbeeld "*1" is om alle regels na "*1" te lezen totdat de eindmarker "*" bereikt is.
Ik ben een beginner en moet veel leren. Op google staan een aantal voorbeelden, maar die zijn erg ingewikkeld. Ik probeer met zo weinig mogelijk regels iets te maken dat ik in een functie kan stoppen om dit vervolges vaker te gebruiken. Zoals gezegd is de begin marker variabel.

Python:
1
2
3
4
5
6
7
8
9
f1 = file_in.txt
f2 = file_out.txt
begin_marker = "* 3"

with open(f1, encoding="utf8", errors='ignore') as f:
    lines = f.readlines()
    lines = [l for l in lines if begin_marker in l]
    with open(f2, "w") as f1:
        f1.writelines(lines)


Nadat ik de code heb uitgevoerd krijg ik alleen de beginmarker te zien in f2. De tekst die hierna volgt in f1 wordt niet meegenomen. Ik kan in alle opgezochte code voorbeelden van internet ook geen duidelijke informatie vinden hoe ik de eindmarker in de code moet aangeven.
Ik heb dit voeger in basic ooit een keer voor elkaar gekregen, maar dat is al lang geleden. In python heb ik daar niets aan. Wie kan mij vooruit helpen.

Acties:
  • 0 Henk 'm!

  • DHH
  • Registratie: Augustus 2014
  • Laatst online: 07-09-2024

DHH

Op basis van je beschrijving, verwacht ik dat je tekstbestand er ongeveer zo uitziet:
code:
1
* 1Wat een prachtige eerste tekst**2 Dit is de tweede tekst*Deze tekst is niet gemarkeerd en moet niet worden meegenomen* 3 Dit is tekst nummer 3*


Dit zou je met regex kunnen oplossen (import re).
code:
1
\*\s?\d(.+?)(?:\*)

Wat de regex doet, zou ik vast kunnen uitleggen, maar niet zo goed als Expresso dat kan:
regex_20190222

Acties:
  • 0 Henk 'm!

  • Jokiehints
  • Registratie: Februari 2019
  • Laatst online: 02-04-2024
@DHH Hallo. Dit is volstrekt nieuw voor mij en lijkt ook aardig cryptisch, maar ik ga het onderzoeken en ik ga na of ik hiermee kan werken, In ieder geval ontzettend bedankt voor het meedenken!

Acties:
  • 0 Henk 'm!

  • Jokiehints
  • Registratie: Februari 2019
  • Laatst online: 02-04-2024
@DHH Hallo DHH. Expression blijkt een windows applicatie. Dat lukt niet op mij ibook. Is er voor apple een soortgelijke tool?

Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

regex101.com, kun je 'm gewoon online testen. Dit heb ik veelvuldig gebruik bij het maken/testen/lezen van regexes

Acties:
  • 0 Henk 'm!

  • DHH
  • Registratie: Augustus 2014
  • Laatst online: 07-09-2024

DHH

Jokiehints schreef op vrijdag 22 februari 2019 @ 21:32:
@DHH Hallo. Dit is volstrekt nieuw voor mij en lijkt ook aardig cryptisch, maar ik ga het onderzoeken en ik ga na of ik hiermee kan werken, In ieder geval ontzettend bedankt voor het meedenken!
Regular expressions zijn ook lastig te lezen, zeker als beginner (waar ik mezelf ook zeker toe reken). Echter omdat je met variabele markers te maken hebt, lijkt me dit voor jou de beste oplossing (mits ik je voorbeeldtekst goed heb begrepen en mijn voorbeeld lijkt op jouw daadwerkelijke teksten).

In de expression die ik gaf, wordt - kortgezegd - eerst gezocht naar een asterix, dan wel of geen spatie en vervolgens een cijfer: \*\s?\d
Alle waarden die daarna volgen mogen worden meegenomen: (.+?)
Tot we de afsluitende asterix tegenkomen: (?:\*).

Als je in je code iets met 're.findall' doet op je lines, dan moet je denk ik een heel eind komen.

Acties:
  • 0 Henk 'm!

  • Jokiehints
  • Registratie: Februari 2019
  • Laatst online: 02-04-2024
@DHH Bedankt voor je toelichting. Zoals ik je aangaf werk ik met een apple en kan ik niet met expression experimenteren. Je hebt mijn text file goed geïnterpreteerd. De tekstblokken staan inderdaad tussen * en een vervolggetal en deze blokken worden afgesloten met een *
* 1 hier volgt tekstdeel 1.
*
* 2 Hier volgt tekstdeel 2
*
* 3 hier volgt tekstdeel 3

Ik ga hiermee verder experimenteren! Nogmaals dank.

Acties:
  • 0 Henk 'm!

  • DHH
  • Registratie: Augustus 2014
  • Laatst online: 07-09-2024

DHH

Geen probleem, zoals @TERW_DAN al suggereerde, werkt regex101.com ook prima.

Succes!

Acties:
  • 0 Henk 'm!

  • Jokiehints
  • Registratie: Februari 2019
  • Laatst online: 02-04-2024
@TERW_DAN Ontzettend bedankt voor deze link. Dit gaat mij helpen om te experimenteren met de verschillende codes!
Pagina: 1