starting SmartSearch
This commit is contained in:
25
src/SmartSearch.py
Normal file
25
src/SmartSearch.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
class SmartSearch:
|
||||||
|
|
||||||
|
def __init__(self, searchTerm):
|
||||||
|
self.regexp = _SmartRegexpFactory().createSmartRegexp(searchTerm)
|
||||||
|
|
||||||
|
def matches(self, str):
|
||||||
|
return True if re.match(self.regexp, str, flags=re.IGNORECASE) else False
|
||||||
|
|
||||||
|
|
||||||
|
class _SmartRegexpFactory:
|
||||||
|
|
||||||
|
def createSmartRegexp(self, searchTerm):
|
||||||
|
return rf'^{self.assertContainsWords(self.getWords(searchTerm))}.*$'
|
||||||
|
|
||||||
|
def getWords(self, searchTerm):
|
||||||
|
return re.split(r'\s+', searchTerm)
|
||||||
|
|
||||||
|
def assertContainsWords(self, words):
|
||||||
|
return ''.join([self.assertContainsWord(word) for word in words])
|
||||||
|
|
||||||
|
def assertContainsWord(self, word):
|
||||||
|
return f'(?=.*?{word})'
|
||||||
15
src/SmartSearchTest.py
Normal file
15
src/SmartSearchTest.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import unittest
|
||||||
|
from SmartSearch import SmartSearch
|
||||||
|
|
||||||
|
|
||||||
|
class SmartSearchTest(unittest.TestCase):
|
||||||
|
|
||||||
|
def test_smartSearch(self):
|
||||||
|
self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('one two three'), True)
|
||||||
|
self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('ONE two ThReE'), True)
|
||||||
|
self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('one two'), False)
|
||||||
|
self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('three two'), False)
|
||||||
|
self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('three two one'), True)
|
||||||
|
self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('TESTone twoTEST TESTthreeTEST'), True)
|
||||||
|
self.assertEqual(SmartSearch(searchTerm = 'eins zwei drei').matches('drei, EINS oder zwei?'), True)
|
||||||
|
self.assertEqual(SmartSearch(searchTerm = 'eins zwei drei').matches('drei, ONE oder zwei?'), False)
|
||||||
Reference in New Issue
Block a user