Úprava textu pomocou regular expressions

Programovacie jazyky, rady, poradňa...
Peter Michalík
Light Expert
Light Expert
Príspevky: 44
Registrovaný: 11 máj 2008, 9:01

Úprava textu pomocou regular expressions

Príspevok od používateľa Peter Michalík »

Prosím o pomoc,
potreboval by som urobiť nejaké úpravy v textovom súbore pomocou regulárnych výrazov a vytvoriť nový textový súbor.

Z tohoto:

Kód: Vybrať všetko

[Genesis 1] 
{1:1} In the beginning, God created heaven 
and earth. 
{1:2} But the earth was empty and unoccupied, 
and darknesses were over the face of the abyss; and so the 
Spirit of God was brought over the waters. 
{1:3} And God 
said, “Let there be light.” And light became. 
{1:4} And 
God saw the light, that it was good; and so he divided the 
light from the darknesses.
potrebujem dostať toto:

Kód: Vybrať všetko

Genesis 1:1 In the beginning, God created heaven and earth. 
Genesis 1:2 But the earth was empty and unoccupied, and darknesses were over the face of the abyss; and so the Spirit of God was brought over the waters. 
Genesis 1:3 And God said, “Let there be light.” And light became. 
Genesis 1:4 And God saw the light, that it was good; and so he divided the light from the darknesses. 
Ten názov "Genesis" sa berie z tej hranatej zátvorky na začiatku bloku, pričom to číslo za tým sa neberie do úvahy a tých blokov je viac s rôznymi názvami a tie čísla sú použité z tých zložitých zátvoriek.

Našla by sa dobrá duša, ktorá by to vedela. :)

Súbor je v prílohe.

Ďakujem.
Peter
Prílohy
CPDV.zip
(1.66 MiB) 18 stiahnutí
Ing. Gandalf
Expert
Expert
Príspevky: 178
Registrovaný: 02 feb 2007, 19:46

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa Ing. Gandalf »

Mam to hotove (aspon myslim :D ), ale az do nedele som na dost nestalom pripojeni (o2 edge). Skusim to upnut, ale ak by to padlo, tu je script, co som pouzil. Je to v Ruby.

Kód: Vybrať všetko

fin = File.open("CPDV.txt")
fout = File.new("CPDV.out.txt", "w")
book = ""
num = "" 

fin.each do |line|
  if line =~ /[\[\]]/
    book = line.match(/^\[(\w+).*\]/)[1]
    fout.puts ""
  elsif line =~ /[\{\}]/
    num = line.match(/^\{(.+)\}/)[1]
    text = line.match(/ .+$/)
    fout.print "\n#{book} #{num}#{text}"
  else
    text = line.match(/^(.*)$/)[1]
    fout.print text
  end
end

fin.close
fout.close
puts "Hotovo!"
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa chrono »

Sú tam aj sekcie typu [1 Samuel 1] a s nimi ti to nefunguje (zobrazí sa len niečo ako 1 1:1 text).
Ing. Gandalf
Expert
Expert
Príspevky: 178
Registrovaný: 02 feb 2007, 19:46

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa Ing. Gandalf »

Do certa... Hore to nespominal a mne sa bibliu citat nechcelo. Upravit to mozem, ale ako to ma vyzerat? Moze byt takto?

Kód: Vybrať všetko

[2 Samuel 4]
{4:7} blabla
...zmeni na:

Kód: Vybrať všetko

Samuel 2 4:7 blabla
PS: Preco je bloknuty 7z :?:
Peter Michalík
Light Expert
Light Expert
Príspevky: 44
Registrovaný: 11 máj 2008, 9:01

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa Peter Michalík »

Malo by to byť takto:

Kód: Vybrať všetko

[2 Samuel 4]
{4:7} blabla
na

Kód: Vybrať všetko

2 Samuel 4:7 blabla
a ospravedlňujem sa, že som to nespomenul, zabudol som :oops:
Ing. Gandalf
Expert
Expert
Príspevky: 178
Registrovaný: 02 feb 2007, 19:46

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa Ing. Gandalf »

Dufam, ze uz je to ok. :D Script:

Kód: Vybrať všetko

fin = File.open("CPDV.txt")
fout = File.new("CPDV.out.txt", "w")
book = ""
num = "" 

fin.each do |line|
  if line =~ /[\[\]]/
    match = line.match(/^\[(\d+)* *(\w+).*\]/)
    book = ""
    book += match[1] + " " if match[1]
    book += match[2]
    fout.puts ""
  elsif line =~ /[\{\}]/
    num = line.match(/^\{(.+)\}/)[1]
    text = line.match(/ .+$/)
    fout.print "\n#{book} #{num}#{text}"
  elsif line =~ /^\*/
    fout.print "\n\n#{line.match(/^.+$/)}"
  else
    text = line.match(/^(.*)$/)[1]
    fout.print text
  end
end

fin.close
fout.close
puts "Hotovo!"
V prilohe je konvertovany subor. Inak vdaka za cvicenie. Prave som objavil caro rubinov... :smt033
Prílohy
CPDV.out.zip
(1.46 MiB) 14 stiahnutí
Peter Michalík
Light Expert
Light Expert
Príspevky: 44
Registrovaný: 11 máj 2008, 9:01

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa Peter Michalík »

Fantastické, ĎAKUJEM. :)

Pomohli ste mi, super.
Nech Vás Boh požehnáva
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa chrono »

Je tam ešte problém s Genesis 24:14 (v pôvodnom súbore chýba za {24:14} medzera, takže to ten skript nespracoval správne). Podobný problém je pri Amos 5:26 a pri Zephaniah 2:1.

Ďalej je problém s časťami Song of Songs (použilo sa tam len Song).

Pri Sirach Prologue asi bude potrebné ručne upraviť P:1 na prologue:1 alebo niečo podobné (podobne aj pri Lamentations Prologue) .

Všetko sa to dá opraviť aj ručne (tých Song of Songs je okolo 130 riadkov ostatných problémov je spolu možno 20 riadkov).
Peter Michalík
Light Expert
Light Expert
Príspevky: 44
Registrovaný: 11 máj 2008, 9:01

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa Peter Michalík »

Ďakujem Chrono, to už zvládnem opraviť aj ručne. 8) :D
Ing. Gandalf
Expert
Expert
Príspevky: 178
Registrovaný: 02 feb 2007, 19:46

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa Ing. Gandalf »

Len pre kompletnost... Kde nebola medzera doplni ju, uz pouzije Song of Songs namiesto iba song a tie prology zobrazi ako Sirach Prologue P:cislo blabla. Upovat to nebudem, tu je script:

Kód: Vybrať všetko

fin = File.open("CPDV.txt")
fout = File.new("CPDV.out.txt", "w")
book = ""
num = "" 

fin.each do |line|
  if line =~ /[\[\]]/
    match = line.match(/\[(\d+)* *(\w+( [a-zA-Z]+)*)( \d+)*?\]/)
    book = ""
    book += match[1] + " " if match[1]
    book += match[2]
    fout.puts ""
  elsif line =~ /[\{\}]/
    num = line.match(/^\{(.+)\}/)[1]
    text = line.match(/^\{.+\}(.+)$/)[1]
    text = " " + text unless text.scan(/./).first == " "
    fout.print "\n#{book} #{num}#{text}"
  elsif line =~ /^\*/
    fout.print "\n\n#{line.match(/^.+$/)}"
  else
    text = line.match(/^(.*)$/)[1]
    fout.print text
  end
end

fin.close
fout.close
puts "Hotovo!"
chrono: Prezrad mi prosim Ta, ako si tak rychlo nasiel chyby? :smt059
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa chrono »

Ja som to robil v python a potom som použil diff aby som zistil rozdiel medzi našimi verziami a tie problémy sa prejavovali v mojej verzii inak, ako v tvojej (a napr. to, že niektoré kapitoly majú pred názvom číslo som zistil hneď, pretože som si nechal vypísať všetky texty v [...] ). :) Ak nám nejaká časť nefungovala úplne rovnako, tak výsledný súbor obsahuje nejakú chybu.
Ing. Gandalf
Expert
Expert
Príspevky: 178
Registrovaný: 02 feb 2007, 19:46

Re: Úprava textu pomocou regular expressions

Príspevok od používateľa Ing. Gandalf »

Klobuk dole. :) Ak mas po ruke ruby, mohol by si, prosim Ta, overit posledny script? Vyzeras byt o dost skusenejsi nez ja...

PS: Ak si to mal hotove, preco si to sem nepostol? :D
Napísať odpoveď