• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JoaoRodrigues

Dúvida em Regular Expression

33 mensagens neste tópico

Tenho este texto:

1: Int J Cancer. 2008 May 19; [Epub ahead of print]

Statin use and the risk of prostate cancer: A metaanalysis of 6 randomized

clinical trials and 13 observational studies.

Bonovas S, Filioussi K, Sitaras NM.

Department of Pharmacology, School of Medicine, University of Athens, Athens,

Greece.

Statins have been suggested to prevent prostate cancer. Our aim was to examine

statin use in relation to both total prostate cancer and the more clinically

important advanced prostate cancer, through a detailed metaanalysis of the

epidemiologic studies published on the subject in peer-reviewed literature. A

comprehensive search for articles published up to November 2007 was performed,

reviews of each study were conducted and data were abstracted. Prior to

metaanalysis, the studies were evaluated for publication bias and heterogeneity.

Pooled relative risk (RR) estimates and 95% confidence intervals (CIs) were

calculated using the random-effects model. Subgroup and sensitivity analyses

were also performed. Nineteen studies [6 randomized clinical trials (RCTs), 6

cohort and 7 case-control studies] contributed to the analysis. There was no

evidence of an association between statin use and total prostate cancer among

either RCTs (RR = 1.06, 95% CI: 0.93-1.20) or the observational studies (RR =

0.89, 95% CI: 0.65-1.24). However, high heterogeneity was detected among the

observational studies. Moreover, long-term statin use did not significantly

affect the risk of total prostate cancer (RR = 0.93, 95% CI: 0.77-1.13). In

contrast, synthesis of the available reports that had specifically examined

statin use in relation to advanced prostate cancer indicated a protective

association (RR = 0.77, 95% CI: 0.64-0.93). Our results do not support the

hypothesis that statins reduce the risk of total prostate cancer. However,

further research is required to investigate whether the particular association

of statin use with lower risk of advanced prostate cancer is indeed causal. ©

2008 Wiley-Liss, Inc.

PMID: 18491405 [PubMed - as supplied by publisher]

Quero separar parágrafo a parágrafo e, tendo em conta que isto se repete várias vezes (são vários artigos), subdividir também por artigo. Ou seja, quero ter algo tipo:

( ('1:', 'Int J Cancer. 2008 May 19; [Epub ahead of print]', 'Statin use and the risk of prostate cancer: A metaanalysis of 6 randomized clinical trials and 13 observational studies.', etc etc), ('2:', etc etc etc) )

O mais longe que consegui ir foi: '(\d+): ([^\n]+)\n+'

Encontra-me a primeira linha toda: '1:', 'Int J Cancer. 2008 May 19; [Epub ahead of print]'

Estou sem ideias...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, não foi com regular expressions que acabei por resolver isto. Mas ficou resolvido e deixo aqui a thread para alguma cabecinha das Regex me satisfazer a dúvida :P

A minha solução foi:

    rawResults = urllib2.urlopen(url).read()
    
    regEx = re.compile(r'(\d+):')
    
    parsedResults = rawResults.split('\n\n')
    
    for i in parsedResults[1:-1]:
        if re.findall(regEx, i):
            print "\n"
            print "*"*50
            print "\n"
        print i.replace('\n', ' ')

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse teu código está em python (coisa que nunca usei), apesar do tópico não estar em nenhuma categoria especifica... Bem, eu diria que estas a complicar a querer usar regex (segundo o que percebi) para todo o texto. Ou seja, se fosse em PHP, recomenda o uso do explode('\n') depois era só fazeres um foreach ao array com uns ifs lá para dentro para ver se era inicio do artigo ou novo paragrafo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, eu sei que está em Python porque foi a maneira como resolvi. Mas comecei a olhar para o problema com regex. Sempre me disseram que era mais eficiente e mais rápido, daí ter começado por aí. De qualquer maneira, o que eu queria era uma maneira de passar o meu raciocínio para regex: dividir o texto por '\n\n' (não por '\n') e dividir estes grupos de texto em vários artigos, quando se encontrasse algo tipo "X: " em que X é um inteiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

acho que com uma coisa tipo isto identificas um cabeçalho

|\d:(.*?)\[(.*?)\]\n|

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continuo a achar a minha sugestão mais simples. Envolver regex pode criar problemas no futuro, basta não estar em pensado e ter um caractere a mais que lá se vai o esquema todo. Qual é o mal de separares para um array por \n e depois só tinhas de verificar (usando esse teu regex por exemplo) se a posição do array que estas a processar é ou não um novo paragrafo e trabalhar consoante a condição...

Acho que usar regex para TODO o texto é complicar e dá mais trabalho para ter a certeza que funcione a 100%. But that's just me...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esta última regez era só para verificar se a linha é um cabeçalho, a ideia é fazer como tu disseste, mas tem que se verificar quando se encontra um cabeçalho para poder saber por onde dividir.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esta última regez era só para verificar se a linha é um cabeçalho, a ideia é fazer como tu disseste, mas tem que se verificar quando se encontra um cabeçalho para poder saber por onde dividir.

Exacto, acho a forma mais simples. Em vez de processar todo o texto com regex.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já vos disse :thumbsup: Acabei por resolver o meu problema com o script que ali está. Queria era uma maneira de fazer exactamente o mesmo, mas usando regex. Mas se é complicado e não compensa, também não vale a pena perder tempo nisso :)

De qualquer maneira, eu tinha que dividir de 2 maneiras o texto. A primeira, artigo a artigo, usando ou a regex que eu ali pus ou a que o pedrotuga pôs. Depois, usando outra que dividisse por '\n\n'. E queria juntar isto tudo numa só regex para ser tudo feito num passo. Mas ok, too complicated :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas queres regex porquê? Para ser tudo num passo? Qual é o mal de mais um par de linhas de código? :) Regex neste caso, não compensa e só complica. É o que eu acho...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Curiosidade :thumbsup: Nem deve ser tudo num passo, mas tava curioso :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o facto de teres um número variável de parágrafos no artigo faz com que seja impossível passares isso para uma array apenas através de RegEx (tanto quanto sei).

Uma expressão deste tipo:

(\d+):\s*([^\n]+)\s*(?[^\n]+)\s*)*

no texto que deste como exemplo, devolveria:

{ 1 || Int J Cancer. 2008 May 19; [Epub ahead of print] || PMID: 18491405 [PubMed - as supplied by publisher] } porque cada parágrafo iria estar a ser "gravado" para o mesmo grupo (o 3º). Penso que não exista nenhuma maneira de fazer com que para cada novo parágrafo ele guardasse num grupo diferente a não ser repetindo '([^\n]+)\s*' várias vezes o que não se torna viável :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acredita que existe coisas bem mais interessantes para aplicares essa tua curiosidade. Neste exemplo, não ias aprender muito e certamente que não ias descobrir todo o potencial de regex :)

@Revolt

Não necessariamente... Bastava ir sacando os parágrafos todos ate descobrir que estamos no próximo paragrafo. Acho que é perfeitamente possível de ser feito, pode é ser complicado e trabalhoso fazer sem erros.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tive a dar uma vista de olhos rápida pela sintaxe de RegEx e não vejo nenhuma maneira de fazer tal coisa apenas por RegEx, sem outro tipo de códigos como ciclos, etc. que seria a curiosidade/duvida inicial do JoaoRodrigues

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Talvez tenhas razão, talvez não... Não sei lol, só sei um pouco de regex e não tenho tempo para andar a fazer brincadeiras...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, foi a esse ponto que cheguei. Teria que ter um padrão tipo ([\d]+: [\s ]+\n) para encontrar o dígito, e daí identificar um novo parágrafo, e depois uma maneira de dizer: encontra todos os possíveis ([[ \n\r\t\w].*\n\n]+). Ou seja, uma classe dentro de uma classe, o que me deu erro :)

Enfim, mas o Nazgulled tem razão, apliquei a minha curiosidade a outras coisas e deu frutos :P Talvez daqui a uns tempos poste aqui o resultado de todas estas perguntas.

Obrigado a todos, afinal fiquei a saber que até sei brincar um bocadinho com regex, e que isto não era tão simples assim! :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É um bom exercício para o fim de semana :-)

O mais turtuoso é devolver a estrutura de dados que pediste (entretanto, reparei que o código que deixaste não devolve uma estrutura de dados).

Aqui fica um sugestão (em Perl):

NOTA: o que está por baixo de '__DATA__' é este bloco de texto:

__DATA__
1: Int J Cancer. 2008 May 19; [Epub ahead of print]

Statin use and the risk of prostate cancer: A metaanalysis of 6 randomized
clinical trials and 13 observational studies.

Bonovas S, Filioussi K, Sitaras NM.

Department of Pharmacology, School of Medicine, University of Athens, Athens,
Greece.

Statins have been suggested to prevent prostate cancer. Our aim was to examine
of statin use with lower risk of advanced prostate cancer is indeed causal. (c)
2008 Wiley-Liss, Inc.

PMID: 18491405 [PubMed - as supplied by publisher]

2: Int J Cancer. 2008 May 19; [Epub ahead of print]

Statin use and the risk of prostate cancer: A metaanalysis of 6 randomized
clinical trials and 13 observational studies.

Bonovas S, Filioussi K, Sitaras NM.

Department of Pharmacology, School of Medicine, University of Athens, Athens,
Greece.

Statins have been suggested to prevent prostate cancer. Our aim was to examine
of statin use with lower risk of advanced prostate cancer is indeed causal. (c)
2008 Wiley-Liss, Inc.

PMID: 18491405 [PubMed - as supplied by publisher]

3: Int J Cancer. 2008 May 19; [Epub ahead of print]

Statin use and the risk of prostate cancer: A metaanalysis of 6 randomized
clinical trials and 13 observational studies.

Bonovas S, Filioussi K, Sitaras NM.

Department of Pharmacology, School of Medicine, University of Athens, Athens,
Greece.

Statins have been suggested to prevent prostate cancer. Our aim was to examine
of statin use with lower risk of advanced prostate cancer is indeed causal. (c)
2008 Wiley-Liss, Inc.

PMID: 18491405 [PubMed - as supplied by publisher]

#!/usr/bin/perl 
use strict;
use warnings;
use Data::Dumper;

undef $/;
my %parag;
foreach ( split m!(^\d+): |\n{2}!m, <DATA> ) {

    my @linha = do { s!\n! !gm; $_ } if $_ && $_ ne '';
    push @{ $parag{all}}, @linha;

    my $i;
    foreach ( reverse @{ $parag{all} } ) { do { $i = $1; last } if ( /^(\d+)$/ ) }

    push @{ $parag{parag}{$i} }, @linha unless !$linha[0] || $linha[0] =~/^\d+$/gm;
}
print Dumper($parag{parag});

__DATA__
......

E o output:

[me@mybox] $ perl regex_parag.pl
$VAR1 = {
          '1' => [
                   'Int J Cancer. 2008 May 19; [Epub ahead of print]',
                   'Statin use and the risk of prostate cancer: A metaanalysis of 6 randomized clinical trials and 13 observational studies.',
                   'Bonovas S, Filioussi K, Sitaras NM.',
                   'Department of Pharmacology, School of Medicine, University of Athens, Athens, Greece.',
                   'Statins have been suggested to prevent prostate cancer. Our aim was to examine of statin use with lower risk of advanced prostate cancer is indeed causal. (c) 2008 Wiley-Liss, Inc.',
                   'PMID: 18491405 [PubMed - as supplied by publisher]'
                 ],
          '3' => [
                   'Int J Cancer. 2008 May 19; [Epub ahead of print]',
                   'Statin use and the risk of prostate cancer: A metaanalysis of 6 randomized clinical trials and 13 observational studies.',
                   'Bonovas S, Filioussi K, Sitaras NM.',
                   'Department of Pharmacology, School of Medicine, University of Athens, Athens, Greece.',
                   'Statins have been suggested to prevent prostate cancer. Our aim was to examine of statin use with lower risk of advanced prostate cancer is indeed causal. (c) 2008 Wiley-Liss, Inc.',
                   'PMID: 18491405 [PubMed - as supplied by publisher]'
                 ],
          '2' => [
                   'Int J Cancer. 2008 May 19; [Epub ahead of print]',
                   'Statin use and the risk of prostate cancer: A metaanalysis of 6 randomized clinical trials and 13 observational studies.',
                   'Bonovas S, Filioussi K, Sitaras NM.',
                   'Department of Pharmacology, School of Medicine, University of Athens, Athens, Greece.',
                   'Statins have been suggested to prevent prostate cancer. Our aim was to examine of statin use with lower risk of advanced prostate cancer is indeed causal. (c) 2008 Wiley-Liss, Inc.',
                   'PMID: 18491405 [PubMed - as supplied by publisher]'
                 ]
        };

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora é só traduzir a coisa para uma linguagem legível :):thumbsup::P

Mas é o equivalente ao que eu fiz em Python. Eu depois acabei por melhorar melhor o meu script para ele dar só o que me interessava, de modo estruturado, ficou assim:

#-*-coding: ISO-8859-15 -*-
# e-Utils scripts
# João Rodrigues

import urllib2
import re

def getAbstracts(alistofids):
    # Get Info
    baseUrl = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=html&rettype=abstract&id=" # Fetches the articles' info
    
    url = baseUrl+",".join(["%s" % iD for iD in alistofids])
    
    rawResults = urllib2.urlopen(url).read()
    
    regEx = re.compile(r'PMID:.(\d+).\[.*\]')
    
    parsedResults = rawResults.split('\n\n')

    # Organize Results

    linkUrl = "http://www.ncbi.nlm.nih.gov/pubmed/"

    curArticle = {}
    allArticles = []
    bigString = 'a'
    gotTitle = 0
    
    for i in parsedResults[1:]:
        if re.match(regEx, i):
            gotTitle = 0
            curArticle["Title"] = curTitle
            curArticle["Abstract"] = bigString
            curArticle["Link"] = linkUrl+str(re.findall(regEx, i)[0])
            curArticle["PMID"] = str(re.findall(regEx, i)[0])
            allArticles.append(curArticle)
            curArticle = {}
            curTitle = ''
            bigString = ''
        else:
            if len(i) > len(bigString): # Abstract is the biggest
                bigString = i.replace('\n', ' ')
            if gotTitle == 1: # Title is the second from top
                curTitle = i.replace('\n', ' ')
                gotTitle += 1
            else:
                gotTitle += 1

    return allArticles # List of dictionaries with Abstract and Title and Link

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mas é o equivalente ao que eu fiz em Python.

Não me parece. Repara que eu só atravesso o texto uma vez.

No teu exemplo, a menos que eu esteja a ler mal, percorres duas vezes: 1º fazes o parse do texto para um array e depois percorres o array.

Seria interessante (para mim) que fizesses um dump do resultado, até para perceber o que é que pretendes efectivamente. Entretanto, percebi que aquilo que estás a fazer não é o mesmo que querias quando escreveste o 1º post ;-)

Agora é só traduzir a coisa para uma linguagem legível

Isso não é difícil, afinal de contas são só meia dúzia de linhas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O meu script leva mais umas coisas porque vai buscar directamente os artigos à fonte, que aliás é a primeira parte. Por isso, a parte "equivalente" ao teu será apenas a partir da variável regex :thumbsup: O output é este:

>>> print getAbstracts([18499712, 18497056])
[
{'Abstract': 'The drug classification scheme of the World Health Organization (WHO) [Anatomical Therapeutic Chemical (ATC)-code] connects chemical classification and therapeutic approach. It is generally accepted that compounds with similar physicochemical properties exhibit similar biological activity. If this hypothesis holds true for drugs, then the ATC-code, the putative medical indication area and potentially the medical target should be predictable on the basis of structural similarity. We have validated that the prediction of the drug class is reliable for WHO-classified drugs. The reliability of the predicted medical effects of the compounds increases with a rising number of (physico-) chemical properties similar to a drug with known function. The web-server translates a user-defined molecule into a structural fingerprint that is compared to about 6300 drugs, which are enriched by 7300 links to molecular targets of the drugs, derived through text mining followed by manual curation. Links to the affected pathways are provided. The similarity to the medical compounds is expressed by the Tanimoto coefficient that gives the structural similarity of two compounds. A similarity score higher than 0.85 results in correct ATC prediction for 81% of all cases. As the biological effect is well predictable, if the structural similarity is sufficient, the web-server allows prognoses about the medical indication area of novel compounds and to find new leads for known targets. Availability: the system is freely accessible at http://bioinformatics.charite.de/superpred. SuperPred can be obtained via a Creative Commons Attribution Noncommercial-Share Alike 3.0 License.', 
'Link': 'http://www.ncbi.nlm.nih.gov/pubmed/18499712', 'PMID': '18499712', 'Title': 'SuperPred: drug classification and target prediction.'}, 

{'Abstract': 'Molecular signatures associated with malignant phenotype would be useful for detection of micrometastatic carcinoma cells. The small breast epithelial mucin (SBEM) gene is predicted to code for a low molecular weight glycoprotein. To evaluate its potential role as a marker for bone marrow (BM) micrometastasis in breast cancer (BC) patients, we have studied in silico and in vitro expression profiles of SBEM gene. Digital SBEM expression in libraries obtained from normal and neoplastic tissues and cell-lines (CL) were displayed and counted on the SAGE Anatomic Viewer. Profiles for cytokeratin-19 and mammaglobin (hMAM), commonly targets used for detection of disseminated BC cells were obtained and compared with SBEM data. Human breast and haematopoietic cancer CL and normal BM were examined by RT-PCR for SBEM and hMAM. Bioinformatics tools were used to gain further insights about the biological role of SBEM in normal breast and BC. Genes with expression patterns in breast libraries correlating with SBEM were identified using two-dimensional display. SBEM tag was detected in 40 libraries (21 BC; 8 non-cancerous breast tissues). Intermediate to high expression was found on 15/21 BC libraries and 7/8 non-tumor breast tissue. SBEM tag count was correlated with ERBB2 (0.662), hMAM (0.409), and RRM2 (-0.379). A model system based on RT-PCR for SBEM mRNA was highly sensitive and specific in order to detect isolated tumor cells. Our results demonstrate that SBEM mRNA may be an imp ortant marker for targeting BC micrometastasis.', 
'Link': 'http://www.ncbi.nlm.nih.gov/pubmed/18497056', 'PMID': '18497056', 'Title': 'In silico and in vitro analysis of small breast epithelial mucin as a marker for bone marrow micrometastasis in breast cancer.'}
]

Ou seja, do texto, tira o abstract, o titulo e o PMID.

Eu provavelmente expressei-me foi mal desde o início :P Tu com regex podes criar grupos, com os (), e no fim, pelo menos em Python, podes chamar por esses grupos. Ora, o que eu pensei foi: se eu posso criar grupos, faço uma regex que me crie um grupo-pai contendo toda a informação do artigo e dentro desse grupo, subgrupos que são os parágrafos desse artigos. Assim, precisaria de uma regex que me distinguisse tanto cada artigo, pelo cabeçalho tipo "digito: frase\n", e apos esse cabeçalho e ate o encontrar outra vez, fosse identificando parágrafos. No fim teria algo (ou queria algo) tipo (artigo1, artigo2, artigo3) em que artigo1 seria (paragrafo1, paragrafo2, ...).

Como não consegui, resolvi fazer o script em Python que faz mais ou menos o mesmo. Separa o texto por parágrafos (\n\n), criando uma lista que contem esses parágrafos todos. Depois, percorre a lista e tem várias condições: como o abstract é SEMPRE o parágrafo de maior extensão, é o maior parágrafo encontrado, o título é o segundo parágrafo sempre, e se encontrar a expressão PMID:digitos, junta tudo o que encontrou e agrupa num artigo. Ou seja, acabo por percorrer o texto também uma só vez, ok, 2, se contares com o split por parágrafos.

Quanto à tradução do teu script: é SEMPRE complicado ler perl :) Uma dúvida só:

foreach ( split m!(^\d+): |\n{2}!m, <DATA> )

A regex identifica o espaço entre o dígito e o \n\n?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Ora, o que eu pensei foi: se eu posso criar grupos, faço uma regex que me crie um grupo-pai contendo toda a informação do artigo e dentro desse grupo, subgrupos que são os parágrafos desse artigos.

É exactamente isso que faço aqui:

foreach ( split m!(^\d+): |\n{2}!m, <DATA> ) {
.....
}

Percorre um ciclo de artigos e de parágrafos à medida que lê o texto.

EDIT:

entretanto vi o teu EDIT. está respondido :-)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fiquei sem perceber metade do teu código, sinceramente :thumbsup: Mas percebi o suficiente para ver que faz exactamente o mesmo que o meu :)

Já agora, outra coisa. Sempre me disseram que para tratar texto, as regex eram a melhor coisa do mundo. São mesmo assim tão eficientes em termos de velocidade, ou são eficientes no sentido de permitirem uma plasticidade brutal no pattern matching?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

depende do tipo de texto que vais tratar. Em termos de performance são muito lentas quando comparadas com as funções "básicas" de strings da maior parte das linguagens como SubStr, StrPos, Split, etc.

Em situações não muito complicadas onde possas usar as funções das strings é aconselhável usá-las porque a performance vai ser melhor.

Noutras situações mais complexas, RegEx é aconselhável pois se tentares implementar um sistema com as funções "básicas", para além de perderes um tempão desgraçado, podes acabar por tornar o código mais lento do que se usasses RegEx

Just my 2 cents :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Fiquei sem perceber metade do teu código, sinceramente

Vou tentar descomplicar:

#!/usr/bin/perl 
use strict;
use warnings;
use Data::Dumper;

undef $/;

#
# Esta e' a hash table que vai armazenar a estrutura de dados
#
my %parag;

#
# Percorremos o texto em 'pedacos' de artigos e para'grafos duplos
#
foreach ( split m!(^\d+): |\n{2}!m, <DATA> ) {

    #
    # Neste momento temos um string que tanto pode ser:
    # 1. ''
    # 2. indefinida
    # 3. um inteiro
    # 4. uma frase
    #

    #
    # Criamos um array para os valores da linha
    #
    my @linha;

    #
    # Se a varia'vel $_ esta' definida e e' diferente de '',
    # eliminamos as quebras de linha,
    # caso contrario, avancamos para o 'pedaco' seguinte
    #
    if ( $_ && $_ ne '' ) {
        $_ =~ s/\n/ /gm;
        @linha = $_;
    }
    else {
        next;
    }

    #
    # Acrescentamos a linha ao array @{ $parag{all} }
    # Este array e' mero colector de 'lixo'. Pode ser qualquer array definido fora
    # do ciclo.
    #
    push @{ $parag{all} }, @linha;

    # 
    # Contador do número do artigo.
    # Nota: este numero e' o que for extraído do texto. Logo, se houver dois
    # artigos que tenham o mesmo numero, o segundo vai sobrepor o primeiro.
    #
    my $i;

    # 
    # Percorremos o array no sentido inverso para sabermos o numero do artigo
    # que estamos a ler, que sera' o ultimo a ter sido acrescentado.
    # Terminamos este ciclo assim que encontrarmos o valor.
    # Este array vai crescer 'a medida que formos lendo o texto, por isso
    # parece-me preferível ler de tra's para a frente.
    #
    foreach ( reverse @{ $parag{all} } ) {

        if (/^(\d+)$/) {
            $i = $1;
            last;
        }

    }

    # 
    # E agora basta adicionar a linha 'a hash table, com a chave correspondente ao artigo
    # que estamos a ler, se a a linha estiver definida e se for diferente de um
    # inteiro.
    #
    if ( $linha[0] && $linha[0] !~ /^\d+$/gm ) {
        push @{ $parag{parag}{$i} }, @linha;
    }

}
print Dumper( $parag{parag} );

Mas percebi o suficiente para ver que faz exactamente o mesmo que o meu

O resultado é semelhante, a forma de lá chegar é que é diferente ;-)

Sempre me disseram que para tratar texto, as regex eram a melhor coisa do mundo.

Como disse o Revolt, depende.

Neste caso em concreto, nem estou a ver como resolver sem usar expressões regulares. Quanto mais não seja, para o split do texto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora