Kann der Perl-Substitutionsoperator mit einem Element in einem Array übereinstimmen?

8

Ich habe ein Array wie dieses

%Vor%

Mein Text befindet sich in dieser Variablen

%Vor%

Ich möchte jedes Vorkommnis jedes Elements meines stopWords-Arrays im skalaren Ganztext vergleichen und durch Leerzeichen ersetzen.

Eine Möglichkeit, dies zu tun, ist wie folgt:

%Vor%

Dies funktioniert und ersetzt jedes Auftreten aller Stoppwörter. Ich habe mich nur gefragt, ob es einen kürzeren Weg dafür gibt.

So:

%Vor%

Das obige scheint nicht zu funktionieren.

    
Radz 27.10.2010, 06:00
quelle

6 Antworten

-1
%Vor%     
Nikhil Jain 27.10.2010, 06:08
quelle
7

Während die verschiedenen map / for -basierten Lösungen funktionieren , führen sie auch die Regex-Verarbeitung Ihrer Zeichenfolge für jedes Stoppwort einzeln durch. Dies ist zwar im angegebenen Beispiel keine große Sache, kann jedoch zu erheblichen Leistungsproblemen führen, wenn der Zieltext und die Stoppwortliste anwachsen.

Jonathan Leffler und Robert P. sind mit ihren Vorschlägen, alle Stoppwörter zu einer einzigen Regex zusammenzufassen, auf dem richtigen Weg, aber eine einfache Prozentzahl aller Stoppwörter zu einer einzigen Alternation ist ein primitiver Ansatz und wird wieder Ineffizient, wenn die Stoppwortliste lang ist.

Geben Sie Regexp :: Assemble ein, wodurch Sie einen viel "schlaueren" Regex erstellen, der alle Probleme löst passt auf einmal zusammen - ich habe es mit Listen von bis zu 1700 Wörtern verwendet, die überprüft werden sollten:

%Vor%

Welche Ausgaben:

%Vor%     
Dave Sherohman 27.10.2010 11:04
quelle
5

Meine beste Lösung:

%Vor%

Vielleicht möchtest du die Regexp mit \b und whitespace schärfen.

    
zoul 27.10.2010 06:10
quelle
3

Was ist mit:

%Vor%

Verketten Sie alle Wörter, um ' \b(and|the|it|...)\b ' zu bilden; Die Klammern um den Join sind notwendig, um ihm einen Listenkontext zu geben; ohne sie endet die Zählung der Wörter. Die Metazeichen " \b " markieren Wortgrenzen und verhindern daher, dass Sie "Tausender" in "Tausender" ändern. Konvertiere das in einen zitierten regulären Ausdruck; Wenden Sie es global auf Ihre Betreffzeile an (so dass alle Vorkommen aller Stoppwörter in einem einzigen Vorgang entfernt werden).

Sie können auch auf die Variable ' $qr ' verzichten:

%Vor%

Ich glaube nicht, dass ich den Code von jemandem beibehalten möchte, der ohne die Variable ' $qrstring ' auskommt; es ist wahrscheinlich möglich, aber ich denke nicht, dass es gut lesbar wäre.

    
Jonathan Leffler 27.10.2010 06:08
quelle
3

Meine paranoide Version:

%Vor%

Verwenden Sie \b für Wortgrenzen und \Q..\E für den Fall, dass eines Ihrer Stoppwörter Zeichen enthält, die von der Regex-Engine als "besonders" interpretiert werden können.

    
mfontani 27.10.2010 09:13
quelle
3

Sie könnten einen Regex-Join verwenden, um einen einzelnen Regex zu erstellen.

%Vor%

Beachten Sie, dass der quotemeta -Teil nur dafür sorgt, dass alle Regex-Zeichen richtig maskiert sind.

    
Robert P 27.10.2010 09:18
quelle

Tags und Links