Решение на Регулярни изрази от Денис Бялев

Обратно към всички решения

Към профила на Денис Бялев

Резултати

  • 7 точки от тестове
  • 0 бонус точки
  • 7 точки общо
  • 26 успешни тест(а)
  • 13 неуспешни тест(а)

Код

import re
class PrivacyFilter:
def __init__(self, value):
self.preserve_phone_country_code=False
self.preserve_email_hostname=False
self.partially_preserve_email_username=False
self.privacy_statement=value
def filtered(self):
filtered_text=self.privacy_statement
patern_email="".join(r'(\d|[a-zA-Z])(\d|[a-zA-Z]|-|_|\+|\.){1,200}'
+ r'@((\d|[a-zA-Z])(\d|[a-zA-Z]|-){1,63}'
+ r'(\d|[a-zA-Z])\.)+[a-zA-Z]{2,3}')
patern_phone="".join(r'(0|\+[1-9]\d\d)(-| )?\d(-| )?\d(-| )?\d(-| )?'
+ r'\d(-| )?\d(-| )?\d?(-| )?\d?(-| )?\d?(-| )?\d?(-| )?\d?')
patern_email_host=r'(\d|[a-zA-Z])(\d|[a-zA-Z]|-|_|\+|\.){1,200}@'
if self.partially_preserve_email_username:
match=True
while match:
match=re.search(patern_email, filtered_text)
if match:
start, end = match.span()
match2=re.search(patern_email_host, filtered_text)
start2, end2 = match2.span()
if abs(end2-start2) < 6:
filtered_text=re.sub(patern_email_host,
'[FILTERED]@', filtered_text)
else:
filtered_text="".join(filtered_text[:start2+3] +
'[FILTERED]@' + filtered_text[end2:])
elif self.preserve_email_hostname:
match = re.search(patern_email, filtered_text)
if match:
filtered_text=re.sub(patern_email_host,
'[FILTERED]@', filtered_text)
else:
match = re.search(patern_email, filtered_text)
if match:
filtered_text = re.sub(patern_email, '[EMAIL]', filtered_text)
if self.preserve_phone_country_code:
match=True
while match:
match = re.search(patern_phone, filtered_text)
if match:
start, end = match.span()
if filtered_text[start] == '+':
filtered_text="".join(filtered_text[:start+4]
+ ' [FILTERED]' + filtered_text[end:])
else:
filtered_text = re.sub(patern_phone,
'[FILTERED]', filtered_text)
else:
match = re.search(patern_phone, filtered_text)
if match:
filtered_text = re.sub(patern_phone,
'[PHONE]', filtered_text)
return filtered_text
class Validations:
def is_email(value):
patern="".join(r'^(\d|[a-zA-Z])(\d|[a-zA-Z]|-|_|\+|\.){1,200}@((\d|'
+ r'[a-zA-Z])(\d|[a-zA-Z]|-){1,63}(\d|[a-zA-Z])\.)+[a-zA-Z]{2,3}$')
return bool(re.search(patern, value))
def is_phone(value):
patern=r'(0|\+[1-9]\d\d)((-| )?\d+){6,12}'
return bool(re.search(patern, value))
def is_hostname(value):
patern="".join(r'^((\d|[a-zA-Z])(\d|[a-zA-Z]|-){1,63}'
+ r'(\d|[a-zA-Z])\.)+[a-zA-Z]{2,3}$')
return bool(re.search(patern, value))
def is_ip_address(value):
patern="".join(r'^([0-1]\d\d|'
+ r'(2(([0-4]\d)|50|51|52|53|54|55))|\d|\d\d)\.'
+ r'([0-1]\d\d|(2(([0-4]\d)|50|51|52|53|54|55))|\d|\d\d)\.'
+ r'([0-1]\d\d|(2(([0-4]\d)|50|51|52|53|54|55))|\d|\d\d)\.'
+ r'([0-1]\d\d|(2(([0-4]\d)|50|51|52|53|54|55))|\d|\d\d)$')
return bool(re.search(patern, value))
def is_number(value):
patern=r'^-?(0|[1-9]\d*)(\.[0-9]+)?$'
return bool(re.search(patern, value))
def is_integer(value):
patern=r'^-?(0|[1-9]\d*)$'
return bool(re.search(patern, value))
def is_date(value):
patern=r'^\d{4,4}-((0[1-9])|10|11|12)-(([0-2][1-9])|10|20|30|31)$'
return bool(re.search(patern, value))
def is_time(value):
patern=r'^(([0-1][0-9])|20|21|22|23):[0-5]\d:[0-5]\d$'
return bool(re.search(patern,value))
def is_datetime(value):
patern="".join(r'^\d{4,4}-((0[1-9])|10|11|12)-(([0-2][0-9])|01|30|31)'
+ r'(\s|T)(([0-1][0-9])|20|21|22|23):[0-5]\d:[0-5]\d$')
return bool(re.search(patern, value))

Лог от изпълнението

...FFF.F..F.....F....FFF..FF...FF......
======================================================================
FAIL: test_does_not_filter_invalid_emails (test.PrivacyFilterTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 48, in test_does_not_filter_invalid_emails
    self.assertEqual(text, solution.PrivacyFilter(text).filtered())
AssertionError: 'Contact me here: _invalid@email.com' != 'Contact me here: _[EMAIL]'
- Contact me here: _invalid@email.com
+ Contact me here: _[EMAIL]


======================================================================
FAIL: test_does_not_filter_invalid_phone_numbers (test.PrivacyFilterTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 86, in test_does_not_filter_invalid_phone_numbers
    self.assertEqual(filtered, solution.PrivacyFilter(text).filtered())
AssertionError: '0005551234569' != '[PHONE]69'
- 0005551234569
+ [PHONE]69


======================================================================
FAIL: test_filters_more_complex_phone_numbers (test.PrivacyFilterTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 76, in test_filters_more_complex_phone_numbers
    self.assertEqual(filtered, solution.PrivacyFilter(text).filtered())
AssertionError: '[PHONE]' != '[PHONE]3'
- [PHONE]
+ [PHONE]3
?        +


======================================================================
FAIL: test_obfuscates_more_complicated_emails (test.PrivacyFilterTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 37, in test_obfuscates_more_complicated_emails
    self.assertEqual(filtered, solution.PrivacyFilter(text).filtered())
AssertionError: '[EMAIL]' != '[EMAIL].jp'
- [EMAIL]
+ [EMAIL].jp
?        +++


======================================================================
FAIL: test_separates_preserved_country_code_from_filtered_phone_with_a_space (test.PrivacyFilterTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 100, in test_separates_preserved_country_code_from_filtered_phone_with_a_space
    self.assertEqual(filtered, filter.filtered())
AssertionError: 'Phone: 0025 [FILTERED]' != 'Phone: 0025(55) 12 12255'
- Phone: 0025 [FILTERED]
+ Phone: 0025(55) 12 12255


======================================================================
FAIL: test_can_validate_more_complex_phone_numbers (test.ValidationsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 160, in test_can_validate_more_complex_phone_numbers
    self.assertIs(solution.Validations.is_phone(phone), valid)
AssertionError: False is not True

======================================================================
FAIL: test_does_not_break_on_phones_in_multiline_strings (test.ValidationsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 163, in test_does_not_break_on_phones_in_multiline_strings
    self.assertFalse(solution.Validations.is_phone("0885123123\nwat?"))
AssertionError: True is not false

======================================================================
FAIL: test_handles_multiline_strings_in_IP_validation_properly (test.ValidationsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 189, in test_handles_multiline_strings_in_IP_validation_properly
    self.assertFalse(solution.Validations.is_ip_address("8.8.8.8\n"))
AssertionError: True is not false

======================================================================
FAIL: test_handles_multiline_strings_in_hostname_validation_properly (test.ValidationsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 179, in test_handles_multiline_strings_in_hostname_validation_properly
    self.assertFalse(solution.Validations.is_hostname("foo.com\n"))
AssertionError: True is not false

======================================================================
FAIL: test_handles_newlines_in_date_validation (test.ValidationsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 259, in test_handles_newlines_in_date_validation
    self.assertFalse(solution.Validations.is_date("2012-11-19\n"))
AssertionError: True is not false

======================================================================
FAIL: test_handles_newlines_in_time_and_datetime_validation (test.ValidationsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 288, in test_handles_newlines_in_time_and_datetime_validation
    self.assertFalse(solution.Validations.is_time("12:01:01\n"))
AssertionError: True is not false

======================================================================
FAIL: test_validates_datetime_values (test.ValidationsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 282, in test_validates_datetime_values
    self.assertFalse(solution.Validations.is_datetime('2012-01-00T23:59:00'))
AssertionError: True is not false

======================================================================
FAIL: test_validates_hostnames (test.ValidationsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "lib/language/python/runner.py", line 60, in thread
    raise it.exc_info[1]
  File "lib/language/python/runner.py", line 48, in run
    self.result = func(*args, **kwargs)
  File "/tmp/d20140513-11348-k6at28/test.py", line 167, in test_validates_hostnames
    self.assertTrue(solution.Validations.is_hostname('some.long-subdomain.domain.co.ul'))
AssertionError: False is not true

----------------------------------------------------------------------
Ran 39 tests in 0.055s

FAILED (failures=13)

История (1 версия и 0 коментара)

Денис обнови решението на 23.04.2014 15:28 (преди около 10 години)

+import re
+
+class PrivacyFilter:
+ def __init__(self, value):
+ self.preserve_phone_country_code=False
+ self.preserve_email_hostname=False
+ self.partially_preserve_email_username=False
+ self.privacy_statement=value
+
+ def filtered(self):
+ filtered_text=self.privacy_statement
+ patern_email="".join(r'(\d|[a-zA-Z])(\d|[a-zA-Z]|-|_|\+|\.){1,200}'
+ + r'@((\d|[a-zA-Z])(\d|[a-zA-Z]|-){1,63}'
+ + r'(\d|[a-zA-Z])\.)+[a-zA-Z]{2,3}')
+ patern_phone="".join(r'(0|\+[1-9]\d\d)(-| )?\d(-| )?\d(-| )?\d(-| )?'
+ + r'\d(-| )?\d(-| )?\d?(-| )?\d?(-| )?\d?(-| )?\d?(-| )?\d?')
+ patern_email_host=r'(\d|[a-zA-Z])(\d|[a-zA-Z]|-|_|\+|\.){1,200}@'
+ if self.partially_preserve_email_username:
+ match=True
+ while match:
+ match=re.search(patern_email, filtered_text)
+ if match:
+ start, end = match.span()
+ match2=re.search(patern_email_host, filtered_text)
+ start2, end2 = match2.span()
+ if abs(end2-start2) < 6:
+ filtered_text=re.sub(patern_email_host,
+ '[FILTERED]@', filtered_text)
+ else:
+ filtered_text="".join(filtered_text[:start2+3] +
+ '[FILTERED]@' + filtered_text[end2:])
+ elif self.preserve_email_hostname:
+ match = re.search(patern_email, filtered_text)
+ if match:
+ filtered_text=re.sub(patern_email_host,
+ '[FILTERED]@', filtered_text)
+ else:
+ match = re.search(patern_email, filtered_text)
+ if match:
+ filtered_text = re.sub(patern_email, '[EMAIL]', filtered_text)
+ if self.preserve_phone_country_code:
+ match=True
+ while match:
+ match = re.search(patern_phone, filtered_text)
+ if match:
+ start, end = match.span()
+ if filtered_text[start] == '+':
+ filtered_text="".join(filtered_text[:start+4]
+ + ' [FILTERED]' + filtered_text[end:])
+ else:
+ filtered_text = re.sub(patern_phone,
+ '[FILTERED]', filtered_text)
+ else:
+ match = re.search(patern_phone, filtered_text)
+ if match:
+ filtered_text = re.sub(patern_phone,
+ '[PHONE]', filtered_text)
+ return filtered_text
+
+
+
+class Validations:
+ def is_email(value):
+ patern="".join(r'^(\d|[a-zA-Z])(\d|[a-zA-Z]|-|_|\+|\.){1,200}@((\d|'
+ + r'[a-zA-Z])(\d|[a-zA-Z]|-){1,63}(\d|[a-zA-Z])\.)+[a-zA-Z]{2,3}$')
+ return bool(re.search(patern, value))
+
+ def is_phone(value):
+ patern=r'(0|\+[1-9]\d\d)((-| )?\d+){6,12}'
+ return bool(re.search(patern, value))
+
+ def is_hostname(value):
+ patern="".join(r'^((\d|[a-zA-Z])(\d|[a-zA-Z]|-){1,63}'
+ + r'(\d|[a-zA-Z])\.)+[a-zA-Z]{2,3}$')
+ return bool(re.search(patern, value))
+
+ def is_ip_address(value):
+ patern="".join(r'^([0-1]\d\d|'
+ + r'(2(([0-4]\d)|50|51|52|53|54|55))|\d|\d\d)\.'
+ + r'([0-1]\d\d|(2(([0-4]\d)|50|51|52|53|54|55))|\d|\d\d)\.'
+ + r'([0-1]\d\d|(2(([0-4]\d)|50|51|52|53|54|55))|\d|\d\d)\.'
+ + r'([0-1]\d\d|(2(([0-4]\d)|50|51|52|53|54|55))|\d|\d\d)$')
+ return bool(re.search(patern, value))
+
+
+ def is_number(value):
+ patern=r'^-?(0|[1-9]\d*)(\.[0-9]+)?$'
+ return bool(re.search(patern, value))
+
+ def is_integer(value):
+ patern=r'^-?(0|[1-9]\d*)$'
+ return bool(re.search(patern, value))
+
+ def is_date(value):
+ patern=r'^\d{4,4}-((0[1-9])|10|11|12)-(([0-2][1-9])|10|20|30|31)$'
+ return bool(re.search(patern, value))
+
+ def is_time(value):
+ patern=r'^(([0-1][0-9])|20|21|22|23):[0-5]\d:[0-5]\d$'
+ return bool(re.search(patern,value))
+
+ def is_datetime(value):
+ patern="".join(r'^\d{4,4}-((0[1-9])|10|11|12)-(([0-2][0-9])|01|30|31)'
+ + r'(\s|T)(([0-1][0-9])|20|21|22|23):[0-5]\d:[0-5]\d$')
+ return bool(re.search(patern, value))