Coverage for presidio_analyzer / predefined_recognizers / generic / date_recognizer.py: 100%

9 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-03-29 09:03 +0000

1from typing import List, Optional 

2 

3from presidio_analyzer import Pattern, PatternRecognizer 

4 

5 

6class DateRecognizer(PatternRecognizer): 

7 """ 

8 Recognize date using regex. 

9 

10 :param patterns: List of patterns to be used by this recognizer 

11 :param context: List of context words to increase confidence in detection 

12 :param supported_language: Language this recognizer supports 

13 :param supported_entity: The entity this recognizer can detect 

14 """ 

15 

16 PATTERNS = [ 

17 Pattern( 

18 "ISO 8601 datetime", 

19 r"\b(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))\b", 

20 0.8, 

21 ), 

22 Pattern( 

23 "mm/dd/yyyy or mm/dd/yy", 

24 r"\b(([1-9]|0[1-9]|1[0-2])/([1-9]|0[1-9]|[1-2][0-9]|3[0-1])/(\d{4}|\d{2}))\b", 

25 0.6, 

26 ), 

27 Pattern( 

28 "dd/mm/yyyy or dd/mm/yy", 

29 r"\b(([1-9]|0[1-9]|[1-2][0-9]|3[0-1])/([1-9]|0[1-9]|1[0-2])/(\d{4}|\d{2}))\b", 

30 0.6, 

31 ), 

32 Pattern( 

33 "yyyy/mm/dd", 

34 r"\b(\d{4}/([1-9]|0[1-9]|1[0-2])/([1-9]|0[1-9]|[1-2][0-9]|3[0-1]))\b", 

35 0.6, 

36 ), 

37 Pattern( 

38 "mm-dd-yyyy", 

39 r"\b(([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[1-2][0-9]|3[0-1])-\d{4})\b", 

40 0.6, 

41 ), 

42 Pattern( 

43 "dd-mm-yyyy", 

44 r"\b(([1-9]|0[1-9]|[1-2][0-9]|3[0-1])-([1-9]|0[1-9]|1[0-2])-\d{4})\b", 

45 0.6, 

46 ), 

47 Pattern( 

48 "yyyy-mm-dd", 

49 r"\b(\d{4}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[1-2][0-9]|3[0-1]))\b", 

50 0.6, 

51 ), 

52 Pattern( 

53 "dd.mm.yyyy or dd.mm.yy", 

54 r"\b(([1-9]|0[1-9]|[1-2][0-9]|3[0-1])\.([1-9]|0[1-9]|1[0-2])\.(\d{4}|\d{2}))\b", 

55 0.6, 

56 ), 

57 Pattern( 

58 "dd-MMM-yyyy or dd-MMM-yy", 

59 r"\b(([1-9]|0[1-9]|[1-2][0-9]|3[0-1])-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)-(\d{4}|\d{2}))\b", 

60 0.6, 

61 ), 

62 Pattern( 

63 "MMM-yyyy or MMM-yy", 

64 r"\b((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)-(\d{4}|\d{2}))\b", 

65 0.6, 

66 ), 

67 Pattern( 

68 "dd-MMM or dd-MMM", 

69 r"\b(([1-9]|0[1-9]|[1-2][0-9]|3[0-1])-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))\b", 

70 0.6, 

71 ), 

72 Pattern( 

73 "mm/yyyy or m/yyyy", 

74 r"\b(([1-9]|0[1-9]|1[0-2])/\d{4})\b", 

75 0.2, 

76 ), 

77 Pattern( 

78 "mm/yy or m/yy", 

79 r"\b(([1-9]|0[1-9]|1[0-2])/\d{2})\b", 

80 0.1, 

81 ), 

82 ] 

83 

84 CONTEXT = ["date", "birthday"] 

85 

86 def __init__( 

87 self, 

88 patterns: Optional[List[Pattern]] = None, 

89 context: Optional[List[str]] = None, 

90 supported_language: str = "en", 

91 supported_entity: str = "DATE_TIME", 

92 name: Optional[str] = None, 

93 ): 

94 patterns = patterns if patterns else self.PATTERNS 

95 context = context if context else self.CONTEXT 

96 super().__init__( 

97 supported_entity=supported_entity, 

98 patterns=patterns, 

99 context=context, 

100 supported_language=supported_language, 

101 name=name, 

102 )