Нахождение строк между двумя подстрокой в ​​тексте с использованием Regex или любой строки - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть строка, txt, следующая:

page_break <abc@email.com> Tue, Jul 30, 2019 at 1:40 AM To: <xyz@email.com>, 
Hello xyz, 
please see attached the document we were looking for
abrcadabra
page_break
To:

Что я ищу для извлечения текста из <abc@email.com> во 2-е вхождение To:

Так чтовывод выглядит так:

Hello xyz, 
please see attached the document we were looking for
abrcadabra

Хотя я пытался regex как re.findall(r'<abc@email.com>(.*?)To:', txt,re.DOTALL), это не дает правильного результата. Вместо этого он выдает следующее

[('', ''),....#similar like this]

Может кто-нибудь помочьна этом? Кроме того, если я хочу сделать начальную строку, т.е. <abc@email.com>, как динамическую, т.е. читать из ['<abc@email.com>','<mnop@email.com>'], как обрабатывать то же самое? PS: мне так же приятно видеть что-либо без регулярных выражений.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Это регулярное выражение:

r'(?:<(?:abc|mnop)@email.com>.*?\n)(.*?)(?:\f\nTo:)'

будет принимать либо <abc@email.com>, либо <mnop@email.com>. В приведенном ниже коде используется другое регулярное выражение, которое будет распознавать только одно письмо за раз, что является переменной.

  1. (?:<(?abc|mnop)@email.com>.*?\n) Соответствует <abc@email.com> или <mnop@email.com> до конца строки вгруппа без захвата.
  2. (.*?) Соответствует всему, вплоть до следующего шаблона (т. е. 3.) в группе захвата.
  3. (?:\f\nTo:) Соответствует \f\nTo: в незаписываемой группегруппа захвата.

Код:

import re

text = """\f <abc@email.com> Tue, Jul 30, 2019 at 1:40 AM To: <xyz@email.com>,
Hello xyz,
please see attached the document we were looking for
abrcadabra
\f
To:

Some more:

\f <mnop@email.com> Tue, Jul 30, 2019 at 1:40 AM To: <xyz@email.com>,
Hello you all,
Thanks for your quick reply.
\f
To:
"""

emails = ['abc@email.com', 'mnop@email.com']
for email in emails:
    print(email, '->', re.findall(rf'(?:<{email}>.*?\n)(.*?)(?:\f\nTo:)', text, flags=re.DOTALL))

Отпечатки:

abc@email.com -> ['Hello xyz,\nplease see attached the document we were looking for\nabrcadabra\n']
mnop@email.com -> ['Hello you all,\nThanks for your quick reply.\n']
0 голосов
/ 07 ноября 2019

Мы можем попытаться использовать re.findall со следующим шаблоном регулярных выражений:

\bTo: <[^>]+@[^>]+>,\s*(.*?)\bTo:

При использовании в режиме DOT ALL это будет захватывать весь контент после того, как электронное письмо появилось перед контентом, вплоть до, но невключая метку To: в конце.

Пример сценария:

inp = """page_break <abc@email.com> Tue, Jul 30, 2019 at 1:40 AM To <xyz@email.com>,
Hello xyz, 
please see attached the document we were looking for
abrcadabra
page_break
To:"""

matches = re.findall(r'\bTo: <[^>]+@[^>]+>,\s*(.*?)\bTo:', inp, flags=re.DOTALL)
print(matches)

['Hello xyz, \nplease see attached the document we were looking for\nabrcadabra\npage_break\n']    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...