2010-02-23 10 views
0

J'ai quelques problèmes avec les expressions régulières dans ruby. Je dois classer certains fichiers qui ont la première ligne suivie par deux nouvelles lignes, comme dans cet exemple:Marquage de texte automatique par expressions régulières. Newlines problème

GIOVIANA 

Si scrivono miliardi di poesie 
sulla terra ma in Giove è ben diverso. 
Neppure una se ne scrive. E certo 
la scienza dei gioviani è altra cosa. 
Che cosa sia non si sa. È assodato 
che la parola uomo lassù desta 
ilarità. 

Les lignes vides peuvent se produire dans d'autres positions du fichier ainsi que des doubles lignes vides. J'ai essayé l'expression rationnelle suivante (et beaucoup d'autres)

/\A.*\n\n/ 

mais je n'obtiens pas le résultat souhaité.

Je vais aussi vous expliquer tout mon projet, au cas où quelqu'un aurait une meilleure idée de la façon de le faire. J'ai besoin de baliser automatiquement les structures textuelles dans un texte simple. Je peux le faire assez bien avec des expressions régulières pour identifier les lignes, les phrases, etc., mais je ne peux pas dire à mon programme ceci:

si la première ligne est suivie par deux newlines c'est une tuile, alors marquez-la avec le balisage du titre et continuez sur la troisième ligne si la première ligne n'est pas suivie de deux nouvelles lignes, alors le poème n'a pas de titre, baliser la première ligne comme un titre, puis baliser tout le poème (y compris la première ligne)

dans le premier cas, le résultat souhaité est

[poem}[title}GIOVIANA{title] 

[line}[sentence}Si scrivono miliardi di poesie{line] 
[line}sulla terra ma in Giove è ben diverso.{sentence]{line] 
[line}[sentence}Neppure una se ne scrive.{sentence][sentence} E certo{line] 
[line}la scienza dei gioviani è altra cosa.{sentence]{line] 
[line}[sentence}Che cosa sia non si sa.{sentence] [sentence}È assodato{line] 
[line}che la parola uomo lassù desta{line] 
[line}ilarità.{sentence]{line] 
{poem] 

dans un poème sans titre comme

Ora sia il tuo passo 
più cauto: a un tiro di sasso 
di qui ti si prepara 
una più rara scena. 

le résultat souhaité est

[poem}[title}[line}[sentence}Ora sia il tuo passo{line]{title] 
[line}più cauto: a un tiro di sasso{line] 
[line}di qui ti si prepara{line] 
[line}una più rara scena.{line]{sentence]{poem] 

Merci

+0

pour répondre à ma première partie de la question, j'étais forgettin \ r, de sorte que le regexp /\A.*\r\n\r\n/ fait le travail> | –

Répondre

1

Vous n'avez pas besoin (sophistiqué) expressions régulières pour cela, il suffit d'écrire un analyseur syntaxique:

lines = string.split("\r\n") ou lines = File.readlines(fname) ,

alors quelque chose comme ceci:

 
IN_SENTENCE=false 
if lines[1] =~ /\w+/ 
puts "[poem}[title}[line}[sentence}#{lines[0].strip}{line]{title]" 
IN_SENTENCE=true 
start = 1 
else 
puts "[poem}[title}#{lines[0].strip}{title]" 
start = 2 
end 
lines[start..lines.size].each do |line| 
    #process line 
end 
+0

merci pour la réponse, je vais essayer cette approche –