Coverage for presidio_analyzer / predefined_recognizers / country_specific / germany / de_handelsregister_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 DeHandelsregisterRecognizer(PatternRecognizer):
7 """
8 Recognizes German commercial register numbers (Handelsregisternummer).
10 The Handelsregisternummer identifies legal entities and sole traders registered
11 in the German Handelsregister (commercial register), maintained by local
12 Amtsgerichte (district courts). It is divided into two sections:
14 - Abteilung A (HRA): Einzelkaufleute (sole traders) and Personengesellschaften
15 (partnerships: OHG, KG, GmbH & Co. KG, etc.). For Einzelkaufleute, the HRA
16 number directly identifies a natural person, making it personal data under
17 DSGVO Art. 4 Nr. 1.
19 - Abteilung B (HRB): Kapitalgesellschaften (corporations: GmbH, AG, KGaA,
20 UG (haftungsbeschränkt), etc.). Identifies legal entities; not personal data
21 unless the entity is a sole shareholder / sole director whose identity is
22 directly derivable.
24 Legal basis: § 9, § 14 HGB (Handelsgesetzbuch), Handelsregisterverordnung (HRV).
25 Data protection: DSGVO Art. 4 Nr. 1 for HRA entries linked to natural persons; BDSG.
27 Format:
28 HR[AB] [optional space] [1–6 digits]
29 Examples: HRA 12345, HRB 123456, HRA12345, HRB 1234 Köln
31 The `HR[AB]` prefix makes the pattern highly specific, resulting in low false
32 positive rates even without a checksum. No formal accuracy evaluation has been
33 performed on a labelled dataset.
35 :param patterns: List of patterns to be used by this recognizer
36 :param context: List of context words to increase confidence in detection
37 :param supported_language: Language this recognizer supports
38 :param supported_entity: The entity this recognizer can detect
39 """
41 PATTERNS = [
42 Pattern(
43 "Handelsregisternummer HRA/HRB",
44 r"\bHR[AB]\s*\d{1,6}\b",
45 0.5,
46 ),
47 ]
49 CONTEXT = [
50 "handelsregister",
51 "handelsregisternummer",
52 "amtsgericht",
53 "registergericht",
54 "hra",
55 "hrb",
56 "hr-nummer",
57 "registerauszug",
58 "handelsregistereintrag",
59 "firma",
60 "gesellschaft",
61 "gmbh",
62 "ag",
63 "ug",
64 "kg",
65 "ohg",
66 "einzelkaufmann",
67 "einzelkauffrau",
68 "handelsregisterblattnummer",
69 ]
71 def __init__(
72 self,
73 patterns: Optional[List[Pattern]] = None,
74 context: Optional[List[str]] = None,
75 supported_language: str = "de",
76 supported_entity: str = "DE_HANDELSREGISTER",
77 name: Optional[str] = None,
78 ):
79 patterns = patterns if patterns else self.PATTERNS
80 context = context if context else self.CONTEXT
81 super().__init__(
82 supported_entity=supported_entity,
83 patterns=patterns,
84 context=context,
85 supported_language=supported_language,
86 name=name,
87 )