The code below at least passes your tests. Hope it helps, Greg
#! /usr/bin/perl use warnings; use strict; use constant { MATCH => 1, NO_MATCH => 0, }; my @tests = ( [ "winter tire", => MATCH ], [ "tire", => MATCH ], [ "retire", => MATCH ], [ "tired", => MATCH ], [ "snowbird tire", => MATCH ], [ "tired on a snow day", => MATCH ], [ "snow tire and regular tire", => MATCH ], [ " tire" => MATCH ], [ "snow tire" => NO_MATCH ], [ "snow tire" => NO_MATCH ], [ "some snowtires" => NO_MATCH ], ); my $not_snow_tire = qr/ ^ \s* tire | ([^w\s]|[^o]w|[^n]ow|[^s]now)\s*tire /xi; my $fail; for (@tests) { my($str,$want) = @$_; my $got = $str =~ /$not_snow_tire/; my $pass = !!$want == !!$got; print "$str: ", ($pass ? "PASS" : "FAIL"), "\n"; ++$fail unless $pass; } print "\n", (!$fail ? "PASS" : "FAIL"), "\n"; __END__ -- ... all these cries of having 'abolished slavery,' of having 'preserved the union,' of establishing a 'government by consent,' and of 'maintaining the national honor' are all gross, shameless, transparent cheats -- so trans- parent that they ought to deceive no one. -- Lysander Spooner, "No Treason" -- http://mail.python.org/mailman/listinfo/python-list