Как извлечь текст между двумя разными совпадениями? - PullRequest
1 голос
/ 22 июня 2010

У меня есть текстовый файл с наборами текста, которые мне нужно извлечь, и выглядит примерно так:

ITEM A blah blah blah ITEM B bloo bloo bloo ITEM A blee blee blee ITEM B

Вот рабочий код, который у меня есть:

finda = r'(Item\sA)'
findb = r'(Item\sB)'
match_a = re.finditer(finda, usefile, 2)  # the "2" is a flag to say ignore case
match_b = re.finditer(findb, usefile, 2)

Я знаю, что могу использовать такие команды, как span, start и end, чтобы найти позиции текста моих совпадений.Но мне нужно делать это много раз, поэтому мне нужно:

  1. начать писать в пункте A и прекратить писать в пункте B.
  2. , если эта первая итерация содержит менее 50 символовlong затем отбросьте и перейдите к следующему
  3. , как только вы найдете набор, который начинается с ITEM A и заканчивается ITEM B и длиной более 50 символов, запишите его в файл

Большое спасибо заранее!Я крутил свои колеса некоторое время.

Ответы [ 2 ]

2 голосов
/ 22 июня 2010

Это может быть сделано в одном регулярном выражении:

with open("output.txt", "w") as f:
    for match in re.finditer(r"(?<=Item\sA)(?:(?!Item\sB).){50,}(?=Item\sB)", subject, re.I):
        f.write(match.group()+"\n")

Это соответствует тому, что находится между Элементом A и Элементом B. Или вы также хотите сопоставить разделители?

регулярное выражение объяснил:

(?<=Item\sA)   # assert that we start our match right after "Item A"
(?:            # start repeated group (non-capturing)
  (?!Item\sB)  # assert that we're not running into "Item B"
  .            # then match any character
){50,}         # repeat this at least 50 times
(?=Item\sB)    # then assert that "Item B" follows next (without making it part of the match)
2 голосов
/ 22 июня 2010

почему не просто:

with open(fname, 'w') as file:
    for match in re.finditer(r'Item A(.+?)Item B', subject, re.I):
        s = match.group(1)
        if len(s) > 50:
            file.write(s)

Примечание: использование фактических числовых значений флагов довольно косо, используйте в re flags.

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