2016-03-18 2 views
0

Итак, у меня есть текстовый файл, и есть несколько строк строки «Продолжайте читать основную историю». Скажем, текст выглядит следующим образом:python regex сохранить строки между первым и последним термином

часть 1

Продолжить чтение основного сюжета

часть 2

Продолжить чтение основного сюжета

часть 3

Продолжить чтение основной истории

Продолжить чтение основного сюжета

часть 4

что я хочу есть part2 и part3, как показано ниже:

часть 2

Продолжить чтение основного сюжета

часть 3

, так как он находится между первым появлением «Продолжить чтение основной истории» и последним его происшествием. Сейчас я думаю об использовании следующего кода:

my_regex = re.compile("(Continue reading the main story)"+ 
        ".*"+ # match as many chars as possible 
        "(Continue reading the main story)", 
        re.DOTALL) 
new_str = my_regex.sub("\1\2", text) 

Однако его не работает. Как это исправить?

+2

Для уточнения, пожалуйста, обновите ваш пост вместе с ожидаемым выходом. – Saleem

+0

Так как '. *?' - это * не-ответное совпадение для любого символа, ваше регулярное выражение, вероятно, остановит * первое * время, которое оно встретит в строке «Продолжить ...». – Evert

+0

извините, что это должно быть. *, Который жадный, нет. *? –

ответ

0

Если вы знаете, что ваш текст не начинается с «Продолжить ...» и не end с «Continue ...», вы можете разделить строку «Продолжить ...», удалить первый, последний и пустой элементы, и вы останетесь с тем, что хотите.

import re 
text = """\ 
part 1 

Continue reading the main story 

part 2 

Continue reading the main story 

part 3 

Continue reading the main story 

Continue reading the main story 

part 4 
""" 

parts = re.split('Continue reading the main story', text) 
print(parts) 
# Ignore first and last part, test for and ignore 
# empty (all whitespace) strings 
innerparts = [part for part in parts[1:-1] if part.strip()] 
print("".join(innerparts)) 

приводит

part 2 



part 3 

(Там же довольно много новых строк, потому что это как вход был. Вы можете использовать part.strip(), если вы хотите, чтобы избавиться от этого.)

0

Попробуйте следующее регулярное выражение. Я использую и LOOKAHEAD назад 'функции:

rx = "(?<=part 1\n{2}Continue reading the main story).*(?=Continue reading the main story[\r\n]+part 4)" 

for match in re.finditer(rx, text, re.IGNORECASE | re.DOTALL | re.MULTILINE): 
    print(match.group().strip()) 

На основании вашего данного текста, он будет печатать

part 2 

Continue reading the main story 

part 3 

Continue reading the main story 
0

Простой re.findall() сделает это.

rgx = r'Continue reading the main story(.*)Continue reading the main story' 
match = re.findall(rgx, text, re.DOTALL) 
if match: 
    result = match[0].strip() 
    print(result) 

Основываясь на вашем данном тексте, это будет печатать

part 2 

Continue reading the main story 

part 3 

Continue reading the main story 
0

Попробуйте следующую закономерность также:

import re 
s = """ 
    part 1 

    Continue reading the main story 

    part 2 

    Continue reading the main story 

    part 3 

    Continue reading the main story 

    Continue reading the main story 

    part 4 
    """ 
print re.findall('(?:\s+Continue reading the main story\s\n)([\s\S]*?)(?:\n\s+Continue reading the main story\s){2}', s)[0] 

Выход:

part 2 

Continue reading the main story 

part 3 
Смежные вопросы