diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py
index db15da050642c246f0d5a0459160791f3a7bc157..332367f53732e435de85b7f115da2c5d6f12c0a9 100644
--- a/lib/spack/llnl/util/lang.py
+++ b/lib/spack/llnl/util/lang.py
@@ -291,6 +291,37 @@ def foo(self, **kwargs):
             % (next(kwargs.iterkeys()), fun.__name__))
 
 
+def match_predicate(*args):
+    """Utility function for making string matching predicates.
+
+    Each arg can be a:
+        - regex
+        - list or tuple of regexes
+        - predicate that takes a string.
+
+    This returns a predicate that is true if:
+        - any arg regex matches
+        - any regex in a list or tuple of regexes matches.
+        - any predicate in args matches.
+    """
+    def match(string):
+        for arg in args:
+            if isinstance(arg, basestring):
+                if re.search(arg, string):
+                    return True
+            elif isinstance(arg, list) or isinstance(arg, tuple):
+                if any(re.search(i, string) for i in arg):
+                    return True
+            elif callable(arg):
+                if arg(string):
+                    return True
+            else:
+                raise ValueError("args to match_predicate must be regex, "
+                                 "list of regexes, or callable.")
+        return False
+    return match
+
+
 class RequiredAttributeError(ValueError):
     def __init__(self, message):
         super(RequiredAttributeError, self).__init__(message)
diff --git a/var/spack/packages/python/package.py b/var/spack/packages/python/package.py
index 705d002e80fcc7161674f10cf40c00adb4eb5b42..31a12ea653d5c7660076707bf8f3b94346589905 100644
--- a/var/spack/packages/python/package.py
+++ b/var/spack/packages/python/package.py
@@ -1,6 +1,7 @@
 import os
 import re
 from contextlib import closing
+from llnl.util.lang import match_predicate
 
 from spack import *
 import spack
@@ -85,23 +86,19 @@ def setup_dependent_environment(self, module, spec, ext_spec):
 
     def python_ignore(self, ext_pkg, args):
         """Add some ignore files to activate/deactivate args."""
-        orig_ignore = args.get('ignore', lambda f: False)
+        ignore_arg = args.get('ignore', lambda f: False)
 
-        def ignore(filename):
-            # Always ignore easy-install.pth, as it needs to be merged.
-            patterns = [r'easy-install\.pth$']
+        # Always ignore easy-install.pth, as it needs to be merged.
+        patterns = [r'easy-install\.pth$']
 
-            # Ignore pieces of setuptools installed by other packages.
-            if ext_pkg.name != 'py-setuptools':
-                patterns.append(r'/site\.pyc?$')
-                patterns.append(r'setuptools\.pth')
-                patterns.append(r'bin/easy_install[^/]*$')
-                patterns.append(r'setuptools.*egg$')
+        # Ignore pieces of setuptools installed by other packages.
+        if ext_pkg.name != 'py-setuptools':
+            patterns.append(r'/site\.pyc?$')
+            patterns.append(r'setuptools\.pth')
+            patterns.append(r'bin/easy_install[^/]*$')
+            patterns.append(r'setuptools.*egg$')
 
-            return (any(re.search(p, filename) for p in patterns) or
-                    orig_ignore(filename))
-
-        return ignore
+        return match_predicate(ignore_arg, patterns)
 
 
     def write_easy_install_pth(self, exts):