From 2b1999476e14d534e5bb0f1be61d9a38c61bfd7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Tue, 28 May 2019 21:03:41 +0200 Subject: [PATCH] implement 'text.rextract()' --- gallery_dl/text.py | 10 ++++++++++ test/test_text.py | 26 ++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/gallery_dl/text.py b/gallery_dl/text.py index ee987099..afe4cb18 100644 --- a/gallery_dl/text.py +++ b/gallery_dl/text.py @@ -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: diff --git a/test/test_text.py b/test/test_text.py index da7d8156..077ca6c5 100644 --- a/test/test_text.py +++ b/test/test_text.py @@ -161,7 +161,7 @@ class TestText(unittest.TestCase): def test_extract(self, f=text.extract): txt = "" - 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 = "" + 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"