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
« prev ^ index » next coverage.py v7.13.1, created at 2026-03-29 09:03 +0000
1from typing import List, Optional
3from presidio_analyzer import Pattern, PatternRecognizer
6class DateRecognizer(PatternRecognizer):
7 """
8 Recognize date using regex.
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 """
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 ]
84 CONTEXT = ["date", "birthday"]
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 )