Как создать список, содержащий все строки между 2 одинаковыми образцами - PullRequest
0 голосов
/ 01 ноября 2019

В качестве примера ниже приведена строка:
string = 'a bcde: Title - 1 xyz; dummy-a bcde: Title - 2.1 xyz; dummy-a bcde: Title - 3.1 xyz; dummy-' Мой интересныйсодержимое находится между «a bcde:» и «xyz», поэтому в этом случае я хотел бы получить эти строки ( Title - 1 , Title - 2.1 , Title -3.1 ) и создайте список.

# following is the code
string = 'a bcde:Title - 1 xyz;dummy-a bcde:Title - 2.1 xyz;dummy-a bcde:Title - 3.1 xyz;dummy-'
start = 'a bcde:'
end = ' xyz'
n = [1,2,3]
title_list = []
for index in n:
    title = (string.split(start))[index].split(end)[0]
    title_list.append(title)
print(title_list)

С текущим кодом он работает как положено, поскольку строка достаточно короткая, я могу определить вхождение (n = [1,2,3]). В то время как строка слишком велика для подсчета, у меня начинаются проблемы. Я ищу способы, которые были бы более эффективными и явными. Я ожидаю создать список строк, содержащий любую информацию между начальным и конечным шаблонами, как показано ниже: ['Title - 1', 'Title - 2.1', 'Title - 3.1', ....]

Спасибо!

1 Ответ

1 голос
/ 01 ноября 2019

взгляните на regex;см. например здесь . Вы можете сделать

import re

string = 'a bcde:Title - 1 xyz;dummy-a bcde:Title - 2.1 xyz;dummy-a bcde:Title - 3.1 xyz;dummy-'

print(re.findall(r'a bcde:(.*?) xyz', string))
# ['Title - 1', 'Title - 2.1', 'Title - 3.1']

или немного более универсальной функцией:

def match_between(s, p0, p1):
    expr = re.compile(p0 + r'(.*?)' + p1)
    return re.findall(expr, string)

patterns = (r'a bcde:', r' xyz')
print(match_between(string, *patterns))
# ['Title - 1', 'Title - 2.1', 'Title - 3.1']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...