Axxxy Skrevet 2. oktober 2013 Del Skrevet 2. oktober 2013 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
Ekko Skrevet 2. oktober 2013 Del Skrevet 2. oktober 2013 Hva om du kjører newstr = string.replace('\n\n','\n') noen ganger først? evt om du kan lage et regulært uttrykk kan du ha ('\n+','\n') 1 Lenke til kommentar
Axxxy Skrevet 2. oktober 2013 Forfatter Del Skrevet 2. oktober 2013 Haha.. takk. Tenkte litt for avansert, men funket det. -Daniel Lenke til kommentar
zotbar1234 Skrevet 2. oktober 2013 Del Skrevet 2. oktober 2013 Hva om du kjører newstr = string.replace('\n\n','\n') noen ganger først? Fungerer opplagt ikke for flere tomme linjer på rad. evt om du kan lage et regulært uttrykk kan du ha ('\n+','\n') Nok en mulighet: "\n".join(line for line in text.split("\n") if line) Lenke til kommentar
Ekko Skrevet 2. oktober 2013 Del Skrevet 2. oktober 2013 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. Lenke til kommentar
Djn Skrevet 3. oktober 2013 Del Skrevet 3. oktober 2013 (endret) 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 3. oktober 2013 av Djn 2 Lenke til kommentar
Axxxy Skrevet 3. oktober 2013 Forfatter Del Skrevet 3. oktober 2013 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
Djn Skrevet 3. oktober 2013 Del Skrevet 3. oktober 2013 (endret) 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 3. oktober 2013 av Djn 1 Lenke til kommentar
zotbar1234 Skrevet 6. oktober 2013 Del Skrevet 6. oktober 2013 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). 1 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå