Schrift
[thread]6034[/thread]

Pattern matching: zahlen aus einem String herauslesen (Seite 3)

Leser: 1


<< |< 1 2 3 4 >| >> 35 Einträge, 4 Seiten
Gast Gast
 2004-01-24 17:21
#79469 #79469
hi,

wieso macht ihr nicht einfach :

Code: (dl )
@list = map { m/^-- (\d+) -+/; $1 }  @list;



Steve
Gast Gast
 2004-01-24 17:27
#79470 #79470
das $1 ist blödsinn.

Steve
GH@NDI
 2004-01-25 01:25
#79471 #79471
User since
2003-09-21
16 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn sichergestellt ist, das an 4. Stelle jedes Strings nur Zahlen folgen, bis zu einem " -" und du die Überprüfung ob es tatsächlich Zahlen über den RegEx nicht brauchst, was spricht dann gegen das gute alte substr und etwas Mathe? :)

Code (perl): (dl )
my $zahlen = substr($line, 4,index($line, " ", 5) - 4);


Hab das aus Spaß grade mal noch gebenchmarkt:

Code: (dl )
1
2
3
4
5
6
Benchmark: timing 1000000 iterations of regex, substr...
regex: 5 wallclock secs ( 4.77 usr + 0.00 sys = 4.77 CPU) @ 209775.54/s (n=1000000)
substr: 1 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 2083333.33/s (n=1000000)

Der Regex Code sah so aus:
my ($zahl) = $line =~ /-\s(\d+?)\s-/;


Dürfte sich also bei 1300 Strings schon minimal bemerkbar machen :)
pq
 2004-01-25 01:50
#79472 #79472
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
@GH@NDI: dazu würd ich gern mal den code sehen, ich krieg da was andres raus. substr
ist hier zwar auch schneller, aber nicht mal doppelt so schnell.
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
GH@NDI
 2004-01-26 18:05
#79473 #79473
User since
2003-09-21
16 Artikel
BenutzerIn
[Homepage] [default_avatar]
@pq
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

use Benchmark;

my $line = "-- 23 ----------------------------------- 868689";

timethese(1000000, {
   substr => sub {
      my $zahlen = substr($line, 4,index($line, " ", 5) - 4);
   },
   regex1 => sub {
      my ($zahl) = $line =~ /-\s(\d+?)/; # Mein Ursprungs-RegEx
   },
   regex2 => sub {
      my ($zahl) = $line =~ /^-- (\d+)/; # Der letzte hier im Thread vorgeschlagene RegEx
   }
});

Gibt bei mir aus:
Code: (dl )
1
2
3
4
Benchmark: timing 1000000 iterations of regex1, regex2, substr...
   regex1:  5 wallclock secs ( 4.15 usr + -0.01 sys =  4.14 CPU) @ 241779.50/s (n=1000000)
   regex2:  3 wallclock secs ( 3.41 usr +  0.00 sys =  3.41 CPU) @ 292911.54/s (n=1000000)
   substr:  1 wallclock secs ( 0.78 usr +  0.00 sys =  0.78 CPU) @ 1280409.73/s (n=1000000)


// Wieso werden tabs innerhalb [ perl] und [ /perl] nicht dargestellt???\n\n

<!--EDIT|GH@NDI|1075133293-->
esskar
 2004-01-26 18:08
#79474 #79474
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
^Z
Benchmark: timing 1000000 iterations of regex1, regex2, substr...
regex1: 4 wallclock secs ( 4.00 usr + -0.02 sys = 3.98 CPU) @ 251004.02/s (n=1000000)
regex2: 3 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 313774.71/s (n=1000000)
substr: 0 wallclock secs ( 0.72 usr + 0.00 sys = 0.72 CPU) @ 1390820.58/s (n=1000000)


Perl 5.8.0, WinXP, AMD 1700XP
DS
 2004-01-26 18:42
#79475 #79475
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
So wie das im Moment is, is der Benchmark ziemlich überflüssig, weil regex1 und substr nicht funktionieren so...

Das substr bei "substr" *~* sollte besser so ausschaun: substr($line,3,index($line,' ',4)-3)
Und "regex1" findet immer nur die erste Ziffer, wegen \d+?... das Fragezeichen gehört da einfach weg, damit das "+" wieder greedy is...

Trotzdem ist und bleibt die substr-Version natürlich die deutlich schnellere, bei mir ca. 3 bis 4-fach so schnell...
esskar
 2004-01-26 18:54
#79476 #79476
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
okay..
neue version
Code: (dl )
1
2
3
4
Benchmark: timing 1000000 iterations of regex1, regex2, substr...
regex1: 4 wallclock secs ( 4.05 usr + 0.00 sys = 4.05 CPU) @ 247096.61/s (n=1000000)
regex2: 5 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 318471.34/s (n=1000000)
substr: 2 wallclock secs ( 0.63 usr + 0.00 sys = 0.63 CPU) @ 1600000.00/s (n=1000000)
pq
 2004-01-26 19:00
#79477 #79477
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
Benchmark: timing 1000000 iterations of regex1, regex2, substr...
   regex1:  2 wallclock secs ( 2.76 usr +  0.00 sys =  2.76 CPU) @ 362318.84/s (n=1000000)
   regex2:  2 wallclock secs ( 2.44 usr +  0.00 sys =  2.44 CPU) @ 409836.07/s (n=1000000)
   substr:  1 wallclock secs ( 0.86 usr +  0.00 sys =  0.86 CPU) @ 1162790.70/s (n=1000000)

This is perl, v5.8.2 built for i686-linux
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
DS
 2004-01-26 19:04
#79478 #79478
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
[OT]Warum nehmt's ihr ned cmpthese her?[/OT]
<< |< 1 2 3 4 >| >> 35 Einträge, 4 Seiten



View all threads created 2004-01-23 16:13.