регулярные выражения Python, соответствующие абзацам, начинающимся с меток - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь сопоставить абзац или абзацы, которые начинаются с букв.Я тестирую и пробовал dotALL, lookaheads, multiline и т. Д., И я не могу заставить его работать.Строка, которую я пытаюсь сопоставить, выглядит следующим образом:

      A-B:  Object, procedure:
      - Somethings.
      - More things, might run over several lines like this where the sentence just keeps on going and going and going and sometimes isn't even a sentence.
      - Another line, sometimes not ending with period
      - Variable amount of white space at the beginning of new lines

       Comment (A-B): sometimes, there are comments which are separated by two \n\n characters like this.*

      C.  Second object, other procedure:
      - More lines.
      - Can have various leads (including no ' - ' leading.
      - Variable number of lines.

Наиболее близким, к которому я пришел, было использование '(. +? \ N \ n |. +? $)' И dotALL.(что я понимаю, небрежно), но даже это не сработало, потому что пропускает комментарии или абзацы, разделенные большим количеством строк, но все еще под заголовком ([AZ]? -? [AZ]).

В идеале яЯ хотел бы захватить заголовок или заголовок (AB :) или (C.) в match.group (1) и остальные абзацы перед следующим заголовком в match.group (2), но я бы хотелпросто будь счастлив захватить все.Я пытался заглядывать в ловушку, чтобы поймать все между заголовками, но пропустил последний экземпляр, у которого в конце заголовка не будет.

Я новичок, и я прошу прощения, если на этот вопрос уже был дан ответ, или если я 'Мне не ясно (но я искал последние 2 дня безуспешно).Спасибо!

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

так вот мое предлагаемое решение для вас:)

import re
with open('./samplestring.txt') as f:
    header =[]
    nonheader = []
    yourString = f.read()
    for line in content.splitlines():
        if(re.match('(^[A-Z]?-?[A-Z]:)|(^[A-Z]\.)',line.lstrip())):
            header.append(line)
        else:
            nonheader.append(line)
0 голосов
/ 01 февраля 2019

Я закончил тем, что отказался от сбора комментариев и всего после них.Я использовал следующий код, чтобы захватить букву для каждого заголовка (группа (1)), текст для заголовка (группа (2)) и текст в абзаце, исключая комментарии (группа (3)).

([AZ] {1,2} | [AZ] - [AZ]) (? :: |.) + (\ W. +) \ N + ((\ s * (- *. +)) +)

([AZ] {1,2} | [AZ] - [AZ]) (? :: |.) + Фиксирует букву (группа 1), двоеточие или точку и пробел (с)) после этого

(\ w. +) \ n + захватывает текст заголовка, а следующая строка (и)

((\ s * (- *. +)) +) захватывает несколько строк, начиная с пробела, тире, пробела и текста

Я ценю вашу помощь в этом!:)

0 голосов
/ 01 февраля 2019

Вы можете использовать

(^[^\n]+)(?:\n *-.+(?:\n.+)*|\n\n.+\n)+
  • (^[^\n]+) - Соответствовать строке заголовка, затем многократно чередоваться между
  • \n *-.+(?:\n.+)* - Строка без комментариев: начинается с пробела, за которым следует -, при желании можно перебрать несколько строк
  • \n\n.+\n - или сопоставить строку комментария

(без флага точки)

https://regex101.com/r/6kle0u/2

Это зависит от того, какие строки комментариев всегда имеют \n\n перед ними.

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