implement 'text.rextract()'
This commit is contained in:
@@ -124,6 +124,16 @@ def extract(txt, begin, end, pos=0):
|
||||
return None, pos
|
||||
|
||||
|
||||
def rextract(txt, begin, end, pos=-1):
|
||||
try:
|
||||
lbeg = len(begin)
|
||||
first = txt.rindex(begin, 0, pos)
|
||||
last = txt.index(end, first + lbeg)
|
||||
return txt[first + lbeg:last], first
|
||||
except (ValueError, TypeError, AttributeError):
|
||||
return None, pos
|
||||
|
||||
|
||||
def extract_all(txt, rules, pos=0, values=None):
|
||||
"""Calls extract for each rule and returns the result in a dict"""
|
||||
if values is None:
|
||||
|
||||
@@ -161,7 +161,7 @@ class TestText(unittest.TestCase):
|
||||
|
||||
def test_extract(self, f=text.extract):
|
||||
txt = "<a><b>"
|
||||
self.assertEqual(f(txt, "<", ">"), ("a", 3))
|
||||
self.assertEqual(f(txt, "<", ">"), ("a" , 3))
|
||||
self.assertEqual(f(txt, "X", ">"), (None, 0))
|
||||
self.assertEqual(f(txt, "<", "X"), (None, 0))
|
||||
|
||||
@@ -173,9 +173,27 @@ class TestText(unittest.TestCase):
|
||||
|
||||
# invalid arguments
|
||||
for value in INVALID:
|
||||
self.assertEqual(f(value , "<" , ">") , (None, 0))
|
||||
self.assertEqual(f(txt, value, ">") , (None, 0))
|
||||
self.assertEqual(f(txt, "<" , value), (None, 0))
|
||||
self.assertEqual(f(value, "<" , ">") , (None, 0))
|
||||
self.assertEqual(f(txt , value, ">") , (None, 0))
|
||||
self.assertEqual(f(txt , "<" , value), (None, 0))
|
||||
|
||||
def test_rextract(self, f=text.rextract):
|
||||
txt = "<a><b>"
|
||||
self.assertEqual(f(txt, "<", ">"), ("b" , 3))
|
||||
self.assertEqual(f(txt, "X", ">"), (None, -1))
|
||||
self.assertEqual(f(txt, "<", "X"), (None, -1))
|
||||
|
||||
# 'pos' argument
|
||||
for i in range(10, 3, -1):
|
||||
self.assertEqual(f(txt, "<", ">", i), ("b", 3))
|
||||
for i in range(3, 0, -1):
|
||||
self.assertEqual(f(txt, "<", ">", i), ("a", 0))
|
||||
|
||||
# invalid arguments
|
||||
for value in INVALID:
|
||||
self.assertEqual(f(value, "<" , ">") , (None, -1))
|
||||
self.assertEqual(f(txt , value, ">") , (None, -1))
|
||||
self.assertEqual(f(txt , "<" , value), (None, -1))
|
||||
|
||||
def test_extract_all(self, f=text.extract_all):
|
||||
txt = "[c][b][a]: xyz! [d][e"
|
||||
|
||||
Reference in New Issue
Block a user