Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: Using special characters in left part of a regex match?

by kcott (Abbot)
on Feb 06, 2013 at 07:10 UTC ( #1017347=note: print w/ replies, xml ) Need Help??


in reply to Using special characters in left part of a regex match?

G'day shamat,

Firstly, my comments (some of which have already been mentioned in earlier responses):

  • Do you really want to compare all fragments with each other? I can envisage a situation where you're attempting to decide whether "... est ..." matches "... in ...". Perhaps you'd want to filter badly damaged fragments from any sort of matching whatsoever.
  • I think you'd be better off comparing the fragments with a single reference string. You wrote "... some of them being partly damaged.", so presumably some of them are complete.
  • You wrote "... only the last string should not match ..." (that would be "quattuor"). If that's the case, "Gallia" should probably be "Gallia ..."
  • The output you show does not match the code that creates it. From the code you posted, I'd be expecting output like:
    N-M:   [string1] and [string2] DO NOT MATCH!

Here's a solution that takes all of the above into account:

#!/usr/bin/env perl use strict; use warnings; my @exemplars = <DATA>; my $reference = shift @exemplars; print "Reference string: $reference"; for (@exemplars) { my $exemplar = $_; s/[.]{3}/.+?/g; if ($reference !~ /$_/) { print "NO MATCH: $exemplar"; } } __DATA__ Gallia est omnis divisa in partes tres Gallia est omnis divisa in ... Gallia est omnis ... Gallia ... omnis divisa in ... Gallia est ... tres Gallia ... partes tres Gallia est ... partes tres Gallia ... divisa ... tres ... tres quattuor Gallia ...

Output:

$ pm_latin_fragments.pl Reference string: Gallia est omnis divisa in partes tres NO MATCH: Gallia NO MATCH: quattuor

-- Ken


Comment on Re: Using special characters in left part of a regex match?
Select or Download Code
Re^2: Using special characters in left part of a regex match?
by shamat (Novice) on Feb 06, 2013 at 21:31 UTC
    Thank you so much Ken! This is amazing. As for your first comment, I might want to compare all the fragments with each other, which is a very hard job. As a work around, I added a (clumsy) piece of code to yours, so that the script picks up the most complete string as the reference one -- meaning the string which contains most words. Here is the code:
    #!/usr/bin/env perl @exemplars = <DATA>; foreach $line (@exemplars) { @words = split (/\s+/, $line); $array[$#words] = $line; } @array = sort { $a <=> $b } @array; $reference = $array[-1]; print "Reference string: $reference"; for (@exemplars) { $exemplar = $_; s/[.]{3}/.+?/g; if ($reference !~ /$_/) { print "NO MATCH: $exemplar"; } } __DATA__ Gallia est omnis divisa in partes tres Gallia est omnis divisa in ... Gallia est omnis ... Gallia ... omnis divisa in ... ... in ... ... est ... Gallia est ... tres Gallia ... partes tres Gallia est ... partes tres Gallia ... divisa ... tres ... tres quattuor Gallia ...
    Output is the same as yours. I will run some tests, and see what happens.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1017347]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (13)
As of 2014-07-22 10:28 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (109 votes), past polls