python регулярное выражение получить все, пока не указано c строки - PullRequest
0 голосов
/ 30 марта 2020

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

This is the most recent email of this thread

More text

From: a@a.com
Date: 13 August, 2018

More text...

From: a@a.com
Sent: Tuesday 23 July
To: b@b.com, c@c.com
Subject: Test

Мне нужно извлечь все до этой комбинации строк:

From: *
Sent: *
To: *
Subject: *

* действует как подстановочный знак.

Таким образом, мой результат должен быть:

This is the most recent email of this thread

More text

From: a@a.com
Date: 13 August, 2018

More text...

Я хочу отфильтровать это с помощью регулярного выражения, но я не могу понять это. Есть указатели?

Это шаблон регулярного выражения, который я пробовал в regex101, но он почему-то не работает в моем скрипте python: r"([\w\W\n]+?)\n((?:from:[^\n]+)\n+((?:\s*sent:[^\n]+)\n+(?:\s*to:[^\n]+)\n*(?:\s*cc:[^\n]+)*\n*(?:\s*bcc:[^\n]+)*\n*(?:\s*subject:[^\n]+)*))"

Спасибо!

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Вы можете попробовать использовать re.findall с позитивным прогнозом. Приближение здесь состоит в том, чтобы соответствовать всему от начала строки до, но не включая, блока текста, который должен остановить совпадение.

inp = """This is the most recent email of this thread

More text

From: a@a.com
Date: 13 August, 2018

More text...

From: a@a.com
Sent: Tuesday 23 July
To: b@b.com, c@c.com
Subject: Test"""

stop_text = """From: a@a.com
Sent: Tuesday 23 July
To: b@b.com, c@c.com
Subject: Test"""
matches = re.findall(r'^.*?(?=' + stop_text + ')', inp, flags=re.DOTALL)
print(matches)

Это печатает:

['This is the most recent email of this thread\n\nMore text\n\nFrom: a@a.com\nDate: 13 August, 2018\n\nMore text...\n\n']
0 голосов
/ 31 марта 2020

Вы можете упростить группировку ....

import re   
str = """This is the most recent email of this thread

More text

From: a@a.com
Date: 13 August, 2018

More text...

From: a@a.com
Sent: Tuesday 23 July
To: b@b.com, c@c.com
Subject: Test"""

x=re.match(r"""(.+?.+)
From:.+?
Sent:.+?
To: .+?,.+?
Subject:.+?.+""",str,flags=re.DOTALL|re.MULTILINE)
print(x.groups())

Группа даст ... следующий результат ...

('This is the most recent email of this thread\n\nMore 
text\n\nFrom:a@a.com\nDate:13 August, 2018\n\nMore text...\n')
0 голосов
/ 30 марта 2020

Учитывая в приведенном вами примере есть параметры регулярного выражения gim, может быть, вам просто нужно включить флаг re.IGNORECASE?

text = """
This is the most recent email of this thread

More text

From: a@a.com
Date: 13 August, 2018

More text...

From: a@a.com
Sent: Tuesday 23 July
To: b@b.com, c@c.com
Subject: Test
"""
pattern = "([\w\W\n]+?)\n((?:from:[^\n]+)\n+((?:\s*sent:[^\n]+)\n+(?:\s*to:[^\n]+)\n*(?:\s*cc:[^\n]+)*\n*(?:\s*bcc:[^\n]+)*\n*(?:\s*subject:[^\n]+)*))"
print(re.findall(pattern, text, re.MULTILINE|re.IGNORECASE))

print

[('\nThis is the most recent email of this thread\n\nMore text\n\nFrom: a@a.com\nDate: 13 August, 2018\n\nMore text...\n', 'From: a@a.com\nSent: Tuesday 23 July\nTo: b@b.com, c@c.com\nSubject: Test', 'Sent: Tuesday 23 July\nTo: b@b.com, c@c.com\nSubject: Test')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...