Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 6819)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -691,6 +691,9 @@
 class EmailField(CharField):
     def __init__(self, *args, **kwargs):
         kwargs['max_length'] = kwargs.get('max_length', 75)
+        self.pattern = kwargs.get('pattern', None)
+        if self.pattern != None and not hasattr(self.pattern, 'match'):
+            self.pattern = re.compile(self.pattern, re.IGNORECASE)
         CharField.__init__(self, *args, **kwargs)
 
     def get_internal_type(self):
@@ -700,10 +703,10 @@
         return [oldforms.EmailField]
 
     def validate(self, field_data, all_data):
-        validators.isValidEmail(field_data, all_data)
+        validators.isValidEmail(field_data, all_data, pattern=self.pattern)
 
     def formfield(self, **kwargs):
-        defaults = {'form_class': forms.EmailField}
+        defaults = {'form_class': forms.EmailField, 'pattern': self.pattern}
         defaults.update(kwargs)
         return super(EmailField, self).formfield(**defaults)
 
@@ -1021,11 +1024,14 @@
         return super(TimeField, self).formfield(**defaults)
 
 class URLField(CharField):
-    def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
+    def __init__(self, verbose_name=None, name=None, verify_exists=True, pattern=None, **kwargs):
         kwargs['max_length'] = kwargs.get('max_length', 200)
         if verify_exists:
             kwargs.setdefault('validator_list', []).append(validators.isExistingURL)
         self.verify_exists = verify_exists
+        self.pattern = pattern
+        if pattern != None and not hasattr(pattern, 'match'):
+            self.pattern = re.compile(pattern, re.IGNORECASE)
         CharField.__init__(self, verbose_name, name, **kwargs)
 
     def get_manipulator_field_objs(self):
@@ -1035,7 +1041,8 @@
         return "CharField"
 
     def formfield(self, **kwargs):
-        defaults = {'form_class': forms.URLField, 'verify_exists': self.verify_exists}
+        defaults = {'form_class': forms.URLField, 'verify_exists': self.verify_exists,
+            'pattern': self.pattern}
         defaults.update(kwargs)
         return super(URLField, self).formfield(**defaults)
 
Index: django/core/validators.py
===================================================================
--- django/core/validators.py	(revision 6819)
+++ django/core/validators.py	(working copy)
@@ -165,8 +165,14 @@
         raise ValidationError, _('Enter a valid date/time in YYYY-MM-DD HH:MM format.')
     _isValidDate(field_data.split()[0])
 
-def isValidEmail(field_data, all_data):
-    if not email_re.search(field_data):
+def isValidEmail(field_data, all_data, pattern = None):
+    re_to_use = email_re
+    if pattern != None:
+        if hasattr(pattern, 'match'):
+            re_to_use = pattern
+        else:
+            re_to_use = re.compile(pattern, re.IGNORECASE)
+    if not re_to_use.search(field_data):
         raise ValidationError, _('Enter a valid e-mail address.')
 
 def isValidImage(field_data, all_data):
Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 6819)
+++ django/newforms/fields.py	(working copy)
@@ -402,8 +402,15 @@
         'invalid': _(u'Enter a valid e-mail address.'),
     }
 
-    def __init__(self, max_length=None, min_length=None, *args, **kwargs):
-        RegexField.__init__(self, email_re, max_length, min_length, *args,
+    def __init__(self, max_length=None, min_length=None, pattern=None, *args, **kwargs):
+        if pattern != None:
+            if hasattr(pattern, 'match'):
+                re_to_use = pattern
+            else:
+                re_to_use = re.compile(pattern, re.IGNORECASE)
+        else:
+            re_to_use = email_re
+        RegexField.__init__(self, re_to_use, max_length, min_length, *args,
                             **kwargs)
 
 try:
@@ -494,8 +501,16 @@
     }
 
     def __init__(self, max_length=None, min_length=None, verify_exists=False,
-            validator_user_agent=URL_VALIDATOR_USER_AGENT, *args, **kwargs):
-        super(URLField, self).__init__(url_re, max_length, min_length, *args,
+            validator_user_agent=URL_VALIDATOR_USER_AGENT, pattern=None,
+            *args, **kwargs):
+        if pattern != None:
+            if hasattr(pattern, 'match'):
+                re_to_use = pattern
+            else:
+                re_to_use = re.compile(pattern, re.IGNORECASE)
+        else:
+            re_to_use = url_re
+        super(URLField, self).__init__(re_to_use, max_length, min_length, *args,
                                        **kwargs)
         self.verify_exists = verify_exists
         self.user_agent = validator_user_agent
Index: tests/regressiontests/forms/fields.py
===================================================================
--- tests/regressiontests/forms/fields.py	(revision 6819)
+++ tests/regressiontests/forms/fields.py	(working copy)
@@ -741,6 +741,23 @@
 ...
 ValidationError: [u'Ensure this value has at most 15 characters (it has 20).']
 
+>>> f = EmailField(pattern=r'^[abc]+$')
+>>> f.clean('abc')
+u'abc'
+>>> f.clean('abcd')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid e-mail address.']
+
+>>> reg = re.compile('^[abc]+$')
+>>> f = EmailField(pattern=reg)
+>>> f.clean('abc')
+u'abc'
+>>> f.clean('abcd')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid e-mail address.']
+
 # FileField ##################################################################
 
 >>> f = FileField()
@@ -896,6 +913,23 @@
 >>> f.clean('https://example.com')
 u'https://example.com'
 
+>>> f = URLField(pattern=r'^http://[abc]+$')
+>>> f.clean('http://abc')
+u'http://abc'
+>>> f.clean('http://abcd')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid URL.']
+
+>>> reg = re.compile('^http://[abc]+$')
+>>> f = URLField(pattern=reg)
+>>> f.clean('http://abc')
+u'http://abc'
+>>> f.clean('http://abcd')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid URL.']
+
 # BooleanField ################################################################
 
 >>> f = BooleanField()
