Завершить цикл после запуска следующего документа (Python 3) - PullRequest
0 голосов
/ 11 декабря 2018

Я хотел бы завершить цикл после начала следующей записи.Например, представьте, что у меня есть следующий текстовый файл, состоящий из трех документов:

Document 1
text1
text1
tex1
Document 2
text2
text2
text2    
Document 3
text3
text3
text3

Я пытаюсь создать файл JSON, который объединяет каждый текст из одной статьи.например, 'body' = text1 text1 text1;'body' = text2 text2 text2'body' = text2 text2 text2.Для этого я ищу слово Document, а затем объединяю текст, следующий за ним, в одну строку.Проблема в том, что мой код пропускает один документ, поэтому он работает только для документов 1 и 3:

for line in f:
    if re.search(r"Document ", line):
        text = ''
        while not re.search(r"Document ", line):
            text += line+' '                     
        article['body'] = text

Есть идеи, как заставить код остановиться (while not) при запуске следующего документа?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Если мы используем регулярное выражение и мы можем сделать все это в регулярном выражении, то пусть регулярное выражение выполнит тяжелую работу:

>>> regex = r"Document\s+\d+((?:(?!\s*Document\s+\d+)\s*.*)+)"
>>> re.findall(regex, str)

Выходы

['text1\ntext1\ntex1', 'text2\ntext2\ntext2', 'text3\ntext3\ntext3']

См. Демо здесь

Распределение регулярных выражений:

  • Document\s+\d+ Соответствует строка разделителя
  • ( Начало группы захвата # 1
    • (?: Начало группы без захвата
      • (?!\s*Document\s+\d+) Если мы не достигаем следующего разделителя
      • \s*.* Соответствует текущей строке
    • )+ Конец группы без захвата, повторите как можно больше
  • ) Конец группы захвата # 1
0 голосов
/ 11 декабря 2018

Вы можете использовать следующий код Python:

article = []
start_matching = False
text = ""
with open(path, "r") as file:
    for line in file:
        if re.match(r"Document\s+\d", line):
            start_matching = True
            if text:
                article.append(text.strip())
                text = ""
            text += line
        else:
            if start_matching:
                text += line
if text:
    article.append(text.strip())

print(article)
# => ['Document 1\ntext1\ntext1\ntex1', 'Document 2\ntext2\ntext2\ntext2', 'Document 3\ntext3\ntext3\ntext3']

См. онлайн-демонстрацию .

Суть в том, что сопоставление начинается только тогда, когда строка начинается с Document, пробелы 1+ и затем цифра (if re.match(r"Document\s+\d", line):), затем строки, принадлежащие этому документу, добавляются и добавляются в список (вы можете настроить вывод для своих нужд).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...