Thread Reguläre Ausdrücke suchen (34 answers)
Opened by Bionerd at 2012-04-18 12:19

topeg
 2012-04-19 03:01
#157623 #157623
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
2012-04-18T14:51:32 Bionerd
Werden nun auch Musterpaarungen gefunden wie Muster 1 und Muster 1, wenn sie sich in unterschiedlichen Bereichen befinden? Das wäre nämlich auch wichtig.

ja

2012-04-18T14:51:32 Bionerd
Zweitens: Wie könnte man es realisieren, dass das Auftreten von Musterpaarungen in einem Array etc. hochgezählt wird? Ich würde denken, man nimmt die Position der Muster im my @motives, also sagen wir i für Muster 1 und j für Muster x. Dann zählt man im Array @anzahl die entsprechende Zelle +1. Ist das realisierbar? Die spätere Übergabe an eine .csv-Datei dürfte ja unkompliziert sein...
EDIT:Geschehen soll dies einmal für das gesamte Verzeichnis!!

so z.B:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# zeile 7:
# Liste aller Kombinationen über alle Dateien
my %anzahl;

#...

  #zeile 21:
  # alle Gefunden Kombinationen durch gehen
  # dann die Suchbegriffe mit "-!-" zusammenfügen
  # und dazu einen Zähler erhöhen
  # "sort" verhindert unnötige Dubletten
  $anzahl{join('-!-', sort @$_[0,1] )}++ for(@found);

#...

# zeile 25:
# Zusammenfassung:
printf ("%s + %s %u\n",split(/-!-/,$_),$all_match{$_}) for(sort keys(%anzahl));


2012-04-18T14:51:32 Bionerd
Dabei fällt mir ein...die Ausgabe der Paarungen+Zeile gefällt mir sehr.
Es sollte doch möglich sein, die einzelnen Ausprägungen der Muster in einem speziellen .txt abzuspeichern,oder? Sprich, alle gefundenen Muster 1_Muster X - Paarungen in ein File, so dass man letztendlich bei 50 Mustern 2500 .txt- Files hat.


Ja es ist nicht schwer in Dateien auszugeben:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# zeile 7:
# Ausgabepfad
# sollte ein gesondertes Verzeichnis ein.
my $out_dir='path/to/dir';

  # Ersatz für Zeile 22:
  # alle Funde durchgehen,
  # passende Datei öffen
  # und Zeile hinzufügen.
  for my $e (@found)
  {
    my ($motive1,$motive2)= sort @$e[0,1];
    my $outpath="$out_dir/$motive1_$motive2.txt";

    if(open(my $fh, '>>', $outpath))
    { printf $fh ("%s + %s found in Line %u and Line %u + %s\n", @$e,$file); }
    else
    { warn("Error open $outpath ($!)"); }
  }



Wie das finden funktioniert:
  • Gehe alle regulären Ausdrücke durch und vermerke die Zeilen in dem sie gefunden wurden.
  • Gehe jede Kombination von zwei Regulären Ausdrücken durch und Erzeuge alle Kombinationen der Zeilen, wobei doppelte Einträge vermieden werden sollen. Hier gäbe es wohl noch Verbesserungsbedarf, da nur die Zeilennummern geprüft werden. Es müsst genauer geprüft werden, ob es eine Dublette oder ein neuer Fund ist.
  • Es wird ein Eintrag in einer Liste mit den beiden Ausdrücken und den Zeilen erstellt.


Wenn eine Liste der Treffer eines Ausdruckes mit sich selbst verglichen wird, muss das gesondert behandelt werden.
Hier die alternative für den Code von Zeile 72-83. Das ist der Teil wo die Funde von Ausdrücken kombiniert werten.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
      if($motive1 eq $motive2)
      {
        my @list=@{$match{$motive1}};
        for my $pos1 (0 .. $#list-1)
        {
          for my $pos2 ($pos1+1 .. $#list)
          {
            push(@found,[$motive1,$motive1,$list[$pos1],$list[$pos2]]);
          }
        }
      }
      else
      {
        for my $line1 (@{$match{$motive1})
        {
          for my $line2 (@{$match{$motive2}})
          {
            push(@found,[$motive1,$motive2,$line1,$line2]);
          }
        }
      }


Die Codeausschnitte habe ich nicht getestet und können Fehler enthalten.

Nebenbei. Auch wenn die Perl1 Form des open noch unterstützt wird, sollte man sich angewöhnen die moderne Form zu nutzen. Sie ist sicherer und hat auch andere Vorzüge. Sie dazu: Wiki:WasIsteinLexikalischerFileHandle

View full thread Reguläre Ausdrücke suchen