Zapis zdań do pliku xml

0
for line in open("nazwa.txt"):
    for text in line.split('.'):
          print(text)

Mam program, który dzieli mi zdania z pliku txt. Jak zapisać wyniki w pliku xml w formacie

<s xml:id="1-1-s">Pierwsze zdanie pierwszego akapitu <\s>
<s xml:id="1-2-s"> Pierwsze zdanie pierwszego akapitu <\s>

dodanie znaczników <code class="python"> i <code class="xml"> - @furious programming

0

A jak próbowałeś czytać ten tekst? o_O

with codecs.open("plik.txt", "r") as input_file:
    data = input_file.read()
0
for line in open("nazwa.txt"):
    for text in line.split('\n\n'):
            print("Akapit:")
            print("Tekst:\n",text)
    for text in line.split('.'):
            print("Tekst:\n",text)

Wynik jest ogólnie zadowalający ale czasami mam pola:

"Tekst: 
                             "-pusta linia

jak pozbyć się tych pustych lini aby się nie pojawiały?

dodanie znaczników <code class="python"> i <code class="none"> - @furious programming

1

Możesz użyć generatora.

split = (x for x in line.split('.') if x and not x.isspace())
for text in split:
    print("Tekst:\n", text)
0

Jak dodać warunek, że kiedy jest 18.03.2014 nie dzielił tego na 3 osobne zdania tylko jako 1.
Jeżeli po "." jest liczba to pomiń.
tak samo kiedy po "." jest mała litera.
Ma ktoś pomysł jak to zaimplementować do mojego kodu?

licznik_akapit = 0
for line in open("nazwa.txt"):
    for text in line.split('\n\n'):
            licznik_tekst = 1
            print("<text>")
            licznik_akapit = licznik_akapit + 1
            split = (x for x in line.split('.') if x and not x.isspace())
            for text in split:
                print("<s xml:id=\"",licznik_akapit,"-",licznik_tekst,"-s\">",text,"<\\s>\n")
                licznik_tekst = licznik_tekst + 1
    print ("<\\text>")
    print ("\n")
2

Ja bym to ciął regexpami, tzn zdefiniował sobie wzorzec zdania jako coś w stylu \w+[.!?]\s+, wczytał tekst i stuknął findall() z takim wzorcem.

0

@up wszystko fajnie ale i tak nic nie rozumiem...
Możesz jakoś jaśniej mi to wytłumaczyć? na jakims przykladzie?

licznik_akapit = licznik_akapit + 1
            split = (x for x in line.split('.',\w+[.!?]\s+) if x and not x.isspace())
            for text in split:

Czy dobrze kombinuej?

0

https://docs.python.org/3.4/howto/regex.html

Przykład do postu Shaloma będzie wyglądał tak:

re.findall(r'\w+[.!?]\s+', twoj_tekst)

To ci zwróci listę stringów które zostaną dopasowane do podanego wzorca.

Ogólnie wyrażenia regularne to dosyć skomplikowana rzecz, szczególnie dla początkującego. Sam się muszę nauczyć.

0

@up nie będe tego stosował bo nie ogarnę. A jakbym chciał dodać kilka warunków tak łopatologicznie:

 split = (x for x in line.split('.') or line.split('?') or line.split('!') if x and not x.isspace())

Niestety nie działa...
A jak dodać warunek kiedy po kropce jest mała litera np
tab. zmiennych
problem z liczbami rozwiązałem za pomocą
". "

1

line.split() to nie jest warunek, tylko to zwraca listę podzielonych stringów. Jeśli chodzi ci o to, żeby dzielić nie tylko po kropce, ale też po innych znakach to właśnie do tego stworzone są... regexpy :) Dodatkowo nie takie straszne jak je malują:

split = (x for x in re.split(r'[.?!]', line) if x and not x.isspace())

A jak dodać warunek kiedy po kropce jest mała litera np
tab. zmiennych

W pytaniu pytasz o sytuacje w której po kropce jest mała litera, a w przykładzie jest spacja. To jak w końcu? Jeśli chodzi o małą literę po kropce to wzorzec będzie chyba \.[a-z]+

0

liczby chodziło mi o tego typu 19.03 itp kiedy po . nie ma spacji znaczy, że to jest przeważnie liczba...

split = (x for x in re.split(r'[.?!]', line) if x and not x.isspace())

wyskakuje, że re mam nie zadeklarowane, kiedy natomiast daje zamiast re - line to wyskakuje mi
'str' object cannot be interpreted as an integer

1

import re ...

0

No tak nie ogarniam tego całego importowania jeszcze...
A kiedy mam

(r'[.?!]', line)

i chcę dodać .[a-z]+

 albo <code class="python">". "

, że po kropce musi być spacja. to jak to zaimplementować w tym fragmencie? Czy może być coś na podobe?

(r'[.?!]'+'. ', line)
1

Dodaj spację do wzorca ;p

split = (x for x in re.split(r'[.?!] ', line) if x and not x.isspace())

Tylko to ci ucina te kropki, znaki zapytania i wykrzykniki. Póki co nie wiem jak to w prosty sposób ominąć, nie znam na tyle regexpów.

0
re.split(r'[.?!] ', line)

a ja głupi kombinowałem ciągle ze spacją w środku nawiasów kwadratowych:

re.split(r'[. ?!]', line)

Zadziałało twoim sposobem dzięki wielkie

0

a ja głupi kombinowałem ciągle ze spacją w środku nawiasów kwadratowych

Ten nawias kwadratowy w regexpach znaczy tyle, że napis zawiera któryś z jego elementów. Czyli [ab] dopasuje np. napisy "ab", "a", "b", "hfasb". Same znaki bez nawiasów kwadratowych oznaczają, że wzorzec dopasuje taki konkretny napis, czyli np. "ab", "aaabab", ale już nie "acb" na przykład.

1 użytkowników online, w tym zalogowanych: 0, gości: 1