Coverage for presidio_analyzer / predefined_recognizers / country_specific / spain / es_nif_recognizer.py: 100%

16 statements  

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

1from typing import List, Optional, Tuple 

2 

3from presidio_analyzer import EntityRecognizer, Pattern, PatternRecognizer 

4 

5 

6class EsNifRecognizer(PatternRecognizer): 

7 """ 

8 Recognize NIF number using regex and checksum. 

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 :param replacement_pairs: List of tuples with potential replacement values 

15 for different strings to be used during pattern matching. 

16 This can allow a greater variety in input, for example by removing dashes or spaces. 

17 """ 

18 

19 PATTERNS = [ 

20 Pattern( 

21 "NIF", 

22 r"\b[0-9]?[0-9]{7}[-]?[A-Z]\b", 

23 0.5, 

24 ), 

25 ] 

26 

27 CONTEXT = ["documento nacional de identidad", "DNI", "NIF", "identificación"] 

28 

29 def __init__( 

30 self, 

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

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

33 supported_language: str = "es", 

34 supported_entity: str = "ES_NIF", 

35 replacement_pairs: Optional[List[Tuple[str, str]]] = None, 

36 name: Optional[str] = None, 

37 ): 

38 self.replacement_pairs = ( 

39 replacement_pairs if replacement_pairs else [("-", ""), (" ", "")] 

40 ) 

41 patterns = patterns if patterns else self.PATTERNS 

42 context = context if context else self.CONTEXT 

43 super().__init__( 

44 supported_entity=supported_entity, 

45 patterns=patterns, 

46 context=context, 

47 supported_language=supported_language, 

48 name=name, 

49 ) 

50 

51 def validate_result(self, pattern_text: str) -> bool: # noqa: D102 

52 pattern_text = EntityRecognizer.sanitize_value( 

53 pattern_text, self.replacement_pairs 

54 ) 

55 letter = pattern_text[-1] 

56 number = int("".join(filter(str.isdigit, pattern_text))) 

57 letters = "TRWAGMYFPDXBNJZSQVHLCKE" 

58 return letter == letters[number % 23]