Нужно выделить текст между марками, реально ли сделать ето с помочью "re"
import re
def between_markers(text: str, begin: str, end: str) -> str:
"""
returns substring between two given markers
"""
if begin in text or end in text:
x=re.compile((begin if begin in text else r'')+r'(?P<word>.+)'+(end if end in text else r''))
y=x.search(text)
else:
return text
return y.group('word')
if __name__ == '__main__':
print('Example:')
print(between_markers('What is >apple<', '>', '<'))
print(between_markers("<head><title>My new site</title></head>",
"<title>", "</title>"))
print(between_markers('No[/b] hi', '[b]', '[/b]'))
print(between_markers('No [b]hi', '[b]', '[/b]'))
Я хочу сделать ето с помочью 're' но на последних два кода он считает и маркера, можна ли ето исправить? Результат должен быть такой:
assert between_markers('What is >apple<', '>', '<') == "apple", "One sym"
assert between_markers("<head><title>My new site</title></head>",
"<title>", "</title>") == "My new site", "HTML"
assert between_markers('No[/b] hi', '[b]', '[/b]') == 'No', 'No opened'
assert between_markers('No [b]hi', '[b]', '[/b]') == 'hi', 'No close'
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
попробуйте так:
def between_markers(text: str, begin: str, end: str) -> str:
"""
returns substring between two given markers
"""
begin = re.escape(begin) if begin in text else ""
end = re.escape(end) if end in text else ""
pat = re.compile(fr".*?{begin}(.+){end}.*")
return pat.sub(r"\1", text)
тесты:
In [27]: between_markers('What is >apple<', '>', '<')
Out[27]: 'apple'
In [28]: between_markers("<head><title>My new site</title></head>", "<title>", "</title>")
Out[28]: 'My new site'
In [29]: between_markers('No[/b] hi', '[b]', '[/b]')
Out[29]: 'No'
In [30]: between_markers('No [b]hi', '[b]', '[/b]')
Out[30]: 'hi'