diff --git a/src/utils/str.py b/src/utils/str.py index 56e3aaebb..66d52bd6b 100644 --- a/src/utils/str.py +++ b/src/utils/str.py @@ -220,11 +220,20 @@ def perlVariableSubstitute(vars, text): def multipleReplacer(dict_): """Return a function that replaces all dict keys by the associated - value.""" + value. More efficient than multiple .replace().""" dict_ = {re.escape(key): val for key,val in dict_.items()} matcher = re.compile('|'.join(dict_.keys())) return lambda x:matcher.sub(lambda m: dict_[m.group(0)], x) +def multipleRemover(list_): + """Return a function that removes all words in the list. A bit more + efficient than multipleReplacer""" + list_ = [re.escape(x) for x in list_] + matcher = re.compile('|'.join(list_)) + return lambda x:matcher.sub(lambda m: '', x) + + + def commaAndify(seq, comma=',', And='and'): """Given a a sequence, returns an English clause for that sequence. diff --git a/test/test_utils.py b/test/test_utils.py index 5baa35fcf..627ba0761 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -309,10 +309,14 @@ class StrTest(SupyTestCase): f = PRTR('s/^/foo/') self.assertEqual(f('bar'), 'foobar') - def testmultipleReplacer(self): + def testMultipleReplacer(self): replacer = utils.str.multipleReplacer({'foo': 'bar', 'a': 'b'}) self.assertEqual(replacer('hi foo hi'), 'hi bar hi') + def testMultipleRemover(self): + remover = utils.str.multipleRemover(['foo', 'bar']) + self.assertEqual(remover('testfoobarbaz'), 'testbaz') + def testPReToReplacerDifferentSeparator(self): f = utils.str.perlReToReplacer('s#foo#bar#') self.assertEqual(f('foobarbaz'), 'barbarbaz')