Index: contrib/admin/views/main.py
===================================================================
--- contrib/admin/views/main.py	(revision 2487)
+++ contrib/admin/views/main.py	(working copy)
@@ -219,13 +219,20 @@
                         break
         lookup_params['order_by'] = ((order_type == 'desc' and '-' or '') + lookup_order_field,)
         if lookup_opts.admin.search_fields and query:
-            complex_queries = []
-            for bit in query.split():
+            # regular expression
+            if len(query) > 2 and query[0] == '/' and query[-1] == '/':
                 or_queries = []
                 for field_name in lookup_opts.admin.search_fields:
-                    or_queries.append(meta.Q(**{'%s__icontains' % field_name: bit}))
-                complex_queries.append(reduce(operator.or_, or_queries))
-            lookup_params['complex'] = reduce(operator.and_, complex_queries)
+                    or_queries.append(meta.Q(**{'%s__iregex' % field_name: query[1:-1]}))
+                lookup_params['complex'] = reduce(operator.or_, or_queries)
+            else:
+                complex_queries = []
+                for bit in query.split():
+                    or_queries = []
+                    for field_name in lookup_opts.admin.search_fields:
+                        or_queries.append(meta.Q(**{'%s__icontains' % field_name: bit}))
+                    complex_queries.append(reduce(operator.or_, or_queries))
+                lookup_params['complex'] = reduce(operator.and_, complex_queries)
         if opts.one_to_one_field:
             lookup_params.update(opts.one_to_one_field.rel.limit_choices_to)
         self.lookup_params = lookup_params
Index: core/db/backends/postgresql.py
===================================================================
--- core/db/backends/postgresql.py	(revision 2487)
+++ core/db/backends/postgresql.py	(working copy)
@@ -172,6 +172,8 @@
     'iexact': 'ILIKE %s',
     'contains': 'LIKE %s',
     'icontains': 'ILIKE %s',
+    'regex': '~ %s',
+    'iregex': '~* %s',
     'ne': '!= %s',
     'gt': '> %s',
     'gte': '>= %s',
Index: core/db/backends/sqlite3.py
===================================================================
--- core/db/backends/sqlite3.py	(revision 2487)
+++ core/db/backends/sqlite3.py	(working copy)
@@ -36,6 +36,7 @@
             # register extract and date_trun functions
             self.connection.create_function("django_extract", 2, _sqlite_extract)
             self.connection.create_function("django_date_trunc", 2, _sqlite_date_trunc)
+            self.connection.create_function("regexp", 2, _sqlite_regexp)
         cursor = self.connection.cursor(factory=SQLiteCursorWrapper)
         cursor.row_factory = utf8rowFactory
         if DEBUG:
@@ -137,6 +138,13 @@
 def get_indexes(cursor, table_name):
     raise NotImplementedError
 
+def _sqlite_regexp(re_pattern, re_string):
+    import re
+    try:
+        return bool(re.search(re_pattern, re_string, re.I))
+    except:
+        return False
+
 # Operators and fields ########################################################
 
 # SQLite requires LIKE statements to include an ESCAPE clause if the value
@@ -147,6 +155,8 @@
     'iexact': "LIKE %s ESCAPE '\\'",
     'contains': "LIKE %s ESCAPE '\\'",
     'icontains': "LIKE %s ESCAPE '\\'",
+    'regex': "REGEXP %s",
+    'iregex': "REGEXP %s",
     'ne': '!= %s',
     'gt': '> %s',
     'gte': '>= %s',
Index: core/db/backends/mysql.py
===================================================================
--- core/db/backends/mysql.py	(revision 2487)
+++ core/db/backends/mysql.py	(working copy)
@@ -156,6 +156,8 @@
     'iexact': 'LIKE %s',
     'contains': 'LIKE BINARY %s',
     'icontains': 'LIKE %s',
+    'regex': 'REGEXP %s',
+    'iregex': 'REGEXP %s',
     'ne': '!= %s',
     'gt': '> %s',
     'gte': '>= %s',
Index: core/meta/__init__.py
===================================================================
--- core/meta/__init__.py	(revision 2487)
+++ core/meta/__init__.py	(working copy)
@@ -1349,6 +1349,8 @@
         return "%s = %%s" % db.get_date_extract_sql(lookup_type, table_prefix + field_name)
     elif lookup_type == 'isnull':
         return "%s%s IS %sNULL" % (table_prefix, field_name, (not value and 'NOT ' or ''))
+    elif lookup_type in ('regex', 'iregex'):
+        raise NotImplementedError
     raise TypeError, "Got invalid lookup_type: %s" % repr(lookup_type)
 
 def function_get_object(opts, klass, does_not_exist_exception, **kwargs):
Index: core/meta/fields.py
===================================================================
--- core/meta/fields.py	(revision 2487)
+++ core/meta/fields.py	(working copy)
@@ -175,7 +175,7 @@
 
     def get_db_prep_lookup(self, lookup_type, value):
         "Returns field's value prepared for database lookup."
-        if lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte', 'ne', 'year', 'month', 'day'):
+        if lookup_type in ('exact', 'regex', 'iregex', 'gt', 'gte', 'lt', 'lte', 'ne', 'year', 'month', 'day'):
             return [value]
         elif lookup_type in ('range', 'in'):
             return value
