import re import unittest import logging pattern_char_only = re.compile('^[A-Z][a-z]+$') pattern_digits_only = re.compile(r'\d+') pattern_no_digits = re.compile(r'\D+') pattern_plz = re.compile('^[0-9]{5}$') pattern_plz2 = re.compile('^\d{5}$') pattern_quote= re.compile(':') pattern_tab = re.compile(r'\t') pattern_simpson = re.compile('Simpson') pattern_simple = re.compile('O*') logging.basicConfig( format='%(asctime)-15s [%(levelname)s] %(funcName)s: %(message)s', level=logging.DEBUG) # Unittest für die Demonstration von regular expressions (re) class TestRegEgEx(unittest.TestCase): # match: Passt der String auf die re def test_match(self): m = pattern_char_only.match('Olli') logging.debug(f'm={m}') self.assertTrue(m.span()[1] >0) # Sucht alle Vorkommnisse der re im String def test_findall(self): s = '5 Äpfel, 10 Bananen, 42 Erdbeeren' logging.debug(f' nur Ziffern: {pattern_digits_only.findall(s)}') logging.debug(f' keine Ziffern: {pattern_no_digits.findall(s)}') m = pattern_char_only.findall('Olli') logging.debug(f'm={m}') self.assertIsNotNone(m) # Prüft die Gültigkeit einer Postleitzahl ('^\d{5}$' genau 5 Ziffern) def test_plz(self): patterns = [pattern_plz,pattern_plz2] plz = ['42275','5600'] for pattern in patterns: m = pattern.findall(plz[0]) logging.debug(f'm={m}') self.assertNotEqual('',m[0]) m = pattern.findall(plz[1]) logging.debug(f'm={m}') self.assertEqual([],m) # Test für Suche def test_search(self): m = pattern_char_only.search('Olli') logging.debug(f'm={m}') #String passt auf die regular expression self.assertIsNotNone(m) m = pattern_char_only.search('123456') logging.debug(f'm={m}') #Dieser String passt nicht. self.assertIsNone(m) # Test zum Splitting (der Satz wird am ':' in die Worte zerlegt) def test_split(self): m = pattern_quote.split(' Die:Würde:des:Menschen:ist:unantastbar.') logging.debug(f'm={m}') self.assertIsNotNone(m) #Die einzelnen Worte ausgeben for word in m: logging.debug(f' Wort: {word}') # Test für Ersetzung (substitution von Tab mit Space) def test_sub(self): m = pattern_tab.sub(' ','Satz\tmit\tTabulator.') logging.debug(f'm={m}') # Test für einfache regular Expression ('O*') def test_simple_re(self): m = pattern_simple.search('Olli') logging.debug(f'm={m.span()}') self.assertTrue(m.end() > 0) m = pattern_simple.search('Luana') logging.debug(f'm={m.span()}') self.assertFalse(m.end() >0) # Test für den Iterator ('*Simpson') def test_finditer(self): m = pattern_simpson.finditer('Homer Simpson, Marge Simpson, Bart Simpson, Lisa Simpson, Maggie Simpson') logging.debug(f'm={m}') # Die einzelnen gefunden Teilstrings ausgeben. for name in m: logging.debug(f'Name={name},Start bei: {name.start()}') if __name__ == '__main__': unittest.main()