Gå til innhold

Anbefalte innlegg

Hei!
Sliter litt, har googlet en stund, men klarer ikke å formulere det, og finne rette stede å lete på.

 

Greien er at jeg har samlet en god del tekst i en variabel.

Setningene blir separert av en ny linje ( \n )

Men noen ganger er det mer enn en nye linjer som separerer enkelte setninger.

 

Kunne forsåvidt skrevet:

newstr = string.replace('\n', '')

som hadde fjernet alle nye linjer, og deretter kunne jeg søkt gjennom teksten, og plassert en ny linje bak hvert punktum. Men det hadde bare blitt rot i oppsettet, så det eneste jeg vil er å fjerne nye linjer om det er flere enn en i rekkefølgen.

 

har også prøvd

newstr = oldstr.split('\n')

Men da endte jeg opp med flere kruseduller her og der, og vil helst ha så lite tekst manipulasjon som mulig.

 

Takk på forhånd!

-Daniel

Lenke til kommentar
Videoannonse
Annonse

Hva er det som ikke funker med første da? Man må selvsagt putte resultatet tilbake i string før man kjører neste gang.

Det fungerer forsåvidt, det er bare uelegant å måtte gå gjennom hele strengen opptil mange ganger for å få med seg alt. I verste fall kan man trenge temmelig mange repetisjoner, som er en litt stygg kompleksitet*. Det blir også flere linjer kode.

 

Hvis du vil bruke en regexp, kan det gjøres i ett jafs med re.sub("\n\n+", "\n", tekst) , og hvis ikke er løsningen til zotbar også elegant. Trikset er at + betyr "en eller flere", og + er grådig (dvs, den vil bruke den lengste mulige matchen), så hvis det er fem linjeskift etter hverandre bytter den ut alle fem.

 

 

* De foreslåtte løsningene kan gjøres på én gjennomgang, og er dermed O(N).

En løkke som bytter ut alle doble linjeskift med enkle inntil teksten slutter å endre seg er litt mer komplisert, og jeg er ikke sikker på at dette er riktig:

Si du har en fil med bare tomme linjer. Hver runde vil halvere antall linjer, så tilsammen blir det log2(N) repetisjoner. Hver runde går gjennom halvparten så mange linjer som forrige, så hvis du begynner med f.eks. 8 blir det 8+4+2+1 gjennomgåtte linjer - som er 2N-1.

Hvis det er en del linjer som ikke er tomme, blir det noe ekstra mengde tid per runde - så totalt noe sånt som O(N + N*log2(N) ) ... som reduserer til O(N*log(N)). Det er fortsatt en av de penere kompleksitetene, men det virker unødvendig å gå opp fra O(N).

Endret av Djn
  • Liker 2
Lenke til kommentar

Takk for alle svar igjen. Skal huske på din teknikk Djn!

 

Men når det kommer til mitt forbruk så bruker jeg Ekko sitt forslag.

I tilfellene som kan komme, så er det maks 8 tomme linjer, '\n'.

 

Så jeg kjørte

for i in range(1, 6):
    string = string.replace('\n\n\n', '\n')

Hadde vist en '\n' for lite når jeg kjørte. Så ja, jeg skjønner godt det kan bli "tungt/unødvendig" for PCen å gå gjennom det flere ganger enn nødvendig i situasjoner.

 

Men uansett, takk for svar!

-Daniel

Lenke til kommentar

Som sagt, du kan bytte ut den løkken med

import re
string = re.sub('\n\n+', '\n', string)

og den vil gjøre akkurat det samme, fortere, og takle alle mengder linjeskift.

 

 

- Daniel

Endret av Djn
  • Liker 1
Lenke til kommentar

Men når det kommer til mitt forbruk så bruker jeg Ekko sitt forslag.

I tilfellene som kan komme, så er det maks 8 tomme linjer, '\n'.

Det er svært korttenkt å belemre ens løsning med slike begrensninger

 

Så jeg kjørte

for i in range(1, 6):
    string = string.replace('\n\n\n', '\n')
Hadde vist en '\n' for lite når jeg kjørte. Så ja, jeg skjønner godt det kan bli "tungt/unødvendig" for PCen å gå gjennom det flere ganger enn nødvendig i situasjoner.

 

Når det finnes løsninger som er kortere, mer lettleste og ikke lider av pussige begresninger, finnes det ingen god grunn til å ikke bruke dem (særlig når de i tillegg er mer effektive).

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...