1. import re
  2. import time
  3. import random
  4. def validate_data(data, patterns, retry_interval=5, max_retries=3):
  5. """
  6. Validates user data against a list of patterns with retry mechanism.
  7. Args:
  8. data (dict): The user data to validate.
  9. patterns (dict): A dictionary where keys are field names and values are regex patterns.
  10. retry_interval (int): The interval (in seconds) between retries.
  11. max_retries (int): The maximum number of retry attempts.
  12. Returns:
  13. dict: A dictionary containing validation results for each field.
  14. Each field's result is a dictionary with 'valid' (bool) and 'message' (str).
  15. Returns None if validation fails after all retries.
  16. """
  17. results = {}
  18. for field, pattern in patterns.items():
  19. results[field] = {'valid': False, 'message': ''}
  20. for attempt in range(max_retries):
  21. try:
  22. if re.match(pattern, str(data.get(field, ''))): # Handle missing fields
  23. results[field]['valid'] = True
  24. results[field]['message'] = ''
  25. break # Validation successful, exit retry loop
  26. else:
  27. # Simulate a potential transient error
  28. if random.random() < 0.1: # 10% chance of failure
  29. time.sleep(retry_interval)
  30. else:
  31. pass #Pattern doesn't match
  32. except Exception as e:
  33. print(f"Validation error for field '{field}': {e}")
  34. if attempt < max_retries - 1:
  35. time.sleep(retry_interval)
  36. else:
  37. return None #validation failed after all retries
  38. if not results[field]['valid']:
  39. results[field]['message'] = f"Field '{field}' does not match pattern: {pattern}"
  40. return results
  41. if __name__ == '__main__':
  42. # Example Usage
  43. user_data = {
  44. 'username': 'valid_user',
  45. 'email': 'test@example.com',
  46. 'age': '30',
  47. 'phone': '123-456-7890'
  48. }
  49. patterns = {
  50. 'username': r'^[a-zA-Z0-9_]+$', # Alphanumeric and underscore
  51. 'email': r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', # Basic email format
  52. 'age': r'^\d+$', # Only digits
  53. 'phone': r'^\d{3}-\d{3}-\d{4}$' # Specific phone number format
  54. }
  55. validation_results = validate_data(user_data, patterns)
  56. if validation_results:
  57. for field, result in validation_results.items():
  58. print(f"{field}: Valid={result['valid']}, Message={result['message']}")
  59. else:
  60. print("Data validation failed after multiple retries.")

Add your comment