Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7654[/thread]

regular expression matcht nicht



<< >> 4 Einträge, 1 Seite
Gast Gast
 2006-01-26 16:23
#62324 #62324
hi leute,
ich habe ein problem mit einer regular expression. folgender quellcode einer html seite liegt vor:

<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=321023&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Aeromonas phage 31</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=230158&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Bacteriophage Aaphi23</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=12402&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Bacteriophage EJ-1</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=292029&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Bacteriophage G1</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=238854&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Bacteriophage S-PM2</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=244310&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Burkholderia cenocepacia phage Bcep1</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=279530&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Burkholderia cenocepacia phage BcepB1A</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=260373&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Burkholderia cepacia phage Bcep43</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=209052&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Burkholderia cepacia phage Bcep781</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=330395&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Listeria bacteriophage P100</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=205877&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Mycobacterium phage Bxz1</STRONG></A>
Code: (dl )
1
2
3
4
5
6
Die Seite folgt also einem Muster nach: <A TITLE="..." HREF="..." <STRONG>...</STRONG></A>...

Ich will einen Abschnitt finden, der eine bestimmte ID hat, dessen Nachfolger, aber auch dessen Vorgänger. Mit dem Nachfolger habe ich kein Problem, wohl aber mit dem Vorgänger.

Ich habe folgende Regular Expression erstellt:
<A TITLE=\"(.+?)\" HREF=\".+?</STRONG></A>.+?<A TITLE=\"(.+?)\" HREF=\".+?&id=12345.+?</STRONG></A>.+?<A TITLE=\"(.+?)\" HREF=\".+?</STRONG></A>


Das Problem daran ist, dass alles vor dem Abschnitt mit der ID expandierd wird und in die Regular Expression hineinfällt. Es muss irgendwie an dem .+ liegen, obwohl ich ein ? angefügt habe, damit es nicht "greedy" reagiert.

Der Schluss funktioniert, also der Abschnitt mit der ID matcht richtig, und der Nachfolger "expandiert" im Gegensatz zum Vorgänger nicht.

Wer kann mir bitte helfen?

lG Johnny
svenXY
 2006-01-26 16:57
#62325 #62325
User since
2005-09-15
33 Artikel
BenutzerIn
[default_avatar]
Hi,
ich würde jeweils nur eine Zeile matchen und die jeweils vorherige zwischenspeichern:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/perl -w

use strict;

# wir wollen z.B. ID 238854, den davor und den danach
my $id = 238854;

my ($previous, $actual, $next) = ('', '', '');

while (<DATA>) {
chomp;
$previous = $actual;
$actual = $_;
if ($actual =~ /^<A TITLE=\"(.+?)\" HREF=\".+mode=Info\&id=$id\&.+$/) {
$next = <DATA>; chomp $next;
last;
}
}

print join("
", $previous,$actual, $next);

### verdammt, wie kann ich hier ein DATA mit jeweils zwei Unterstrichen einfügen, ohne dass des Forum es wieder rausschneidet?
--DATA--
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=321023&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Aeromonas phage 31</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=230158&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Bacteriophage Aaphi23</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=12402&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Bacteriophage EJ-1</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=292029&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Bacteriophage G1</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=238854&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Bacteriophage S-PM2</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=244310&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Burkholderia cenocepacia phage Bcep1</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=279530&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Burkholderia cenocepacia phage BcepB1A</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=260373&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Burkholderia cepacia phage Bcep43</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=209052&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Burkholderia cepacia phage Bcep781</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=330395&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Listeria bacteriophage P100</STRONG></A><LI TYPE=square>
<A TITLE="species" HREF="/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=205877&lvl=10&lin=f&keep=1&srchmode=1&unlock&filter=genome_filter"><STRONG>Mycobacterium phage Bxz1</STRONG></A>


Nur so nebenbei: HTML mit RegExes zu Leibe zu rücken ist meist ein schmerzhafter Prozess. Es würde sich eher sowas wie HTML::TreeBuilder oder so anbieten.

Gruss,
Sven\n\n

<!--EDIT|svenXY|1138287679-->
pq
 2006-01-26 17:30
#62326 #62326
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@johnny: wieso schreibst du text in deinem posting in code-tags, aber code
nicht in code-tags?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2006-01-27 00:00
#62327 #62327
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum benutzt Du nicht einen Parser für HTML, wie z.B. CPAN:HTML::TreeBuilder oder CPAN:HTML::Parser?? Das nimmt Dir die meiste Arbeit ab!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 4 Einträge, 1 Seite



View all threads created 2006-01-26 16:23.