Как мне записать все строки в список с учетом начального и конечного символов?

Вот что я пробовал:

import re

sequence = "This is start #\n hello word #\n #\n my code#\n this is end"

query = '#\n'
r = re.compile(query)
findall = re.findall(query,sequence)
print(findall)

Это дает:

['#\n', '#\n', '#\n', '#\n']

Ищете вывод как:

[' hello word ',' my code']
0
sharp 1 Май 2019 в 20:42

5 ответов

Лучший ответ

Простого split() будет достаточно:

sequence = "This is start #\n hello word #\n #\n my code#\n this is end"

parts = sequence.split("#\n")[1:-1]  # discard 1st and last because it is not between #\n

print(parts)

Это даст вам (1-ая и последняя часть немедленно отбрасываются, потому что это не между '#\n':

[' hello word ', ' ', ' my code'] # ' ' is strictly also between two #\n

Вы можете очистить это:

# remove spaces and "empty" hits if it is only whitespace
mod_parts = [p.strip() for p in parts if p.strip()]

print(mod_parts)

Чтобы добраться до:

['hello word', 'my code']

Или короче говоря:

shorter = [x.strip() for x in sequence.split("#\n")[1:-1]]
1
Patrick Artner 1 Май 2019 в 17:46

Вы могли бы использовать

#\n([\s\S]+?)#\n

Как в

import re
rx = re.compile(r'#\n([\s\S]+?)#\n')

text = """This is start #
 hello word #
 #
 my code#
 this is end"""

matches = rx.findall(text)
print(matches)

Это поможет вам встать на путь.

[' hello word ', ' my code']

Смотрите демонстрацию для выражения на regex101.com .

0
Jan 1 Май 2019 в 18:09

Пытаться:

print(re.findall("#\n(.*?)#\n", sequence))

Регулярное выражение - захватывать (без жадности) что-нибудь между двумя '#\n', но никогда не использовать это для следующего захвата. Но если вы хотите использовать его в качестве разделителя (например, split(), вы можете попробовать использовать lookahead:

print(re.findall("#\n(.*?)(?=#\n)", sequence))

И в этом случае вывод будет

[' hello word ', ' ', ' my code']
1
adrtam 1 Май 2019 в 17:47

В этом случае было бы лучше просто использовать строковую функцию .split() и передать ее #\n как то, что вы хотите разделить. Вы можете проверить длину с помощью s.strip() и отфильтровать пустые строки. Если по какой-то причине вам не нужны первая и последняя порции, вы можете использовать кусочки [1:-1] для их удаления.

sequence = "This is start #\n hello word #\n #\n my code#\n this is end"
print(sequence.split("#\n"))
# ['This is start ', ' hello word ', ' ', ' my code', ' this is end']

print([s.strip() for s in sequence.split("#\n") if s.strip()])
# ['This is start', 'hello word', 'my code', 'this is end']

print([s.strip() for s in sequence.split("#\n") if s.strip()][1:-1])
# ['hello word', 'my code']
1
Cohan 1 Май 2019 в 17:58

Как и предложил Брайан, вы можете использовать функцию split. Однако, если вы рассматриваете эти начальные и конечные шаблоны как скобки, правильный способ найти токены:

print([s.strip() for s in sequence.split("#\n")][1:-1:2])

Он просто пропускает строки между концом и следующим началом. Например, если вход

sequence = "This is start #\n hello word #\n BETWEEN END1 AND START2 #\n my code#\n this is end"

Термин BETWEEN END1 AND START2 не должен быть зафиксирован; Итак, правильный вывод:

['hello word', 'my code']
1
noidsirius 1 Май 2019 в 18:02