Avatar billede tangveje Nybegynder
18. november 2005 - 17:44 Der er 19 kommentarer og
1 løsning

Python : Split ved mellemrum og punktum, behold kun punktummer

Jeg har et problem med følgende kode :

    self.re_split = re.compile( '([ |.])' )
    self.words = self.re_split.split( text )

Formålet er at splitte en tekst op for hvert mellemrum eller punktum, men beholde punktummerne. "Dette er en test." skulle altså blive til arrayet ["Dette", "er", "en", "test", "."]

Desværre kommer mellemrum også med da parantesen i min reg.exp. omfatter hele gruppen og ikke kun punktummet, men det hjælper desværre ikke kun at sætte parantes om punktummet da parantesen så ignoreres.

Nogen der kan finde på en løsning?
Avatar billede bertelbrander Novice
18. november 2005 - 20:54 #1
Jeg tror at det letteste er at slette mellemrum bagefter:

import string, re

text = "Dette er en test."
re_split = re.compile( '([ |.])' )
words=[]
temp = re_split.split(text)

for word in temp :
  if word != ' ' :
      words.append(word)

for word in words :
    print word
Avatar billede tangveje Nybegynder
18. november 2005 - 21:16 #2
Hmm, det minder mig om en anden besynderlighed... det gør jeg nemlig allerede, med denne funktion

def wordclean( self ):
    i = 0
    while i < len( self.words ) :
        if self.words[i] == ' ' or self.words[i] == '' :
            del self.words[i]           
        i = i + 1

Det har undret mig meget at denne funktion aldrig rigtigt får dem alle med. Men uanset hvad ville jeg faktisk helst helt af med den for at forbedre programmets performance (som pt. ikke er særlig god)
Avatar billede bertelbrander Novice
18. november 2005 - 21:30 #3
Hvis der er to mellemrum efter hinanden vil den ikke slette det andet.
Du bør kun tælle i op hvis ikke du sletter.
Avatar billede tangveje Nybegynder
18. november 2005 - 21:37 #4
Wohoo, det hjalp :) Tak for hjælpen
Avatar billede tangveje Nybegynder
18. november 2005 - 21:54 #5
Nu da jeg er igang kunne du måske hjælpe mig med et tillægs spm... teksten får jeg enten fra en fil eller en URL, men jeg vil gerne sikre mig at der er tale om ren tekst eller et HTML dokument, og ikke f.eks. et Word dokument eller en zip fil.

Jeg har søgt i dokumentationen og på google men kan ikke finde noget overhovedet. Jeg forhøjer gerne pointsne hvis du har nogen ideer til hvordan jeg gør det.
Avatar billede arne_v Ekspert
18. november 2005 - 22:28 #6
en modificeret version af Bertels:

import string, re

text = "Dette er en test. Dette er en test."
re_split = re.compile(' ')
words = re_split.split(text.replace(".", " . "))

for word in words:
    print word
Avatar billede bertelbrander Novice
18. november 2005 - 22:39 #7
Du kunne løbe strengen igennem og bruge isxxx funktionerne til at checke
En kombination af ismeta og isctrl kunne være en start.

>arne, smart.
Avatar billede tangveje Nybegynder
18. november 2005 - 23:01 #8
Arne > Det er godt nok fikst, og næsten perfekt. Der kommer dog stadig nogen få tomme værdier med i arrayet, tilsyneladende efter hvert punktum. Hvis man kunne slippe af med dem kunne jeg helt undvære min oprydnings funktion :)

Bertel > Er det de is*** funktioner der er i curses.ascii modulet?

Mit håb var nu at kunne slå brugeren oven i hovedet med det samme hvis de valgte en forkert filtype, uden først at skulle åbne og læse filens indhold alt for meget. Kan man ikke læse en fils type direkte?
Avatar billede arne_v Ekspert
18. november 2005 - 23:05 #9
import string, re

text = "Dette er en test. Dette er en test."
re_split = re.compile(' ')
words = re_split.split(text.replace(".", " ."))

for word in words:
    print word

undgår nok det, men så får du problem hvis der ikke allerede er et mellemrum efter punktum
Avatar billede arne_v Ekspert
18. november 2005 - 23:06 #10
import string, re

text = "Dette er en test. Dette er en test.xxxx."
re_split = re.compile(' ')
words = re_split.split(text.replace(".", " . ").replace(".  ",". "))

for word in words:
    print word

måske, men det smarte er ved at falme lidt
Avatar billede tangveje Nybegynder
18. november 2005 - 23:17 #11
Det er der noget om :) Så er det vel lige før min oprydnings funktion er mere effektiv, performance mæssigt.
Avatar billede bertelbrander Novice
18. november 2005 - 23:28 #12
Du kan finde extension og så checke om det er en du kender.
Ja, det var is*** i curses.ascii jeg tænkte på.
Avatar billede tangveje Nybegynder
18. november 2005 - 23:32 #13
Det er sandt, men det vil jeg betegne som en højst uberegnelig metode som nok ikke engang bør overvejes. Specielt når vi taler om URL's, hvor "www.foo.dk/bar/" jo kunne være hvad som helst.
Avatar billede bertelbrander Novice
18. november 2005 - 23:35 #14
I så fald er du nok nød til at løbe teksten igennem for at finde ulovlige tegn.
Avatar billede tangveje Nybegynder
18. november 2005 - 23:41 #15
Hmm, kom til at tænke på om man ikke kan finde filens MIME type? Det må da kunne bruges.
Avatar billede bertelbrander Novice
19. november 2005 - 00:33 #16
Det er vist ikke alle typer fil der har en MIME type
Avatar billede tangveje Nybegynder
19. november 2005 - 19:30 #17
Kan være du har ret. Der må være en løsning men jeg har på fornemmelsen at det involverer meget mere end jeg bryder mig om, så foreløbigt vil jeg glemme det og arbejde på nogen af de andre ting der skal laves.

Men tak for hjælpen, lægger i nogen svar?
Avatar billede bertelbrander Novice
19. november 2005 - 19:38 #18
Jeg samle ikke på point.

Der er også is*** i string.
Avatar billede arne_v Ekspert
19. november 2005 - 20:45 #19
jeg takker nej til point da jeg ikke rigtigt synes at jeg har bidraget med noget
Avatar billede tangveje Nybegynder
19. november 2005 - 21:25 #20
Ok da :) Men tak alligevel
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester