python regex khớp toàn bộ đoạn bao gồm cả dòng mới
Tôi có một tệp văn bản, từ đó tôi muốn khớp toàn bộ khối đoạn văn nhưng regex hiện tại của tôi không hoạt động để khớp toàn bộ đoạn văn kể cả dòng mới.
Ví dụ văn bản:
NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.
EXONERAR DOUGLAS ALVES BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.
NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
OTHER TEXT GOES HERE
....................
020007/002832/2020.
Từ khối văn bản trên, tôi muốn khớp toàn bộ đoạn văn bắt đầu bằng từ NOMEAR
NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.
NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
OTHER TEXT GOES HERE
....................
020007/002832/2020.
Những gì tôi đã thử
import re
pattern = re.compile("NOMEAR (.*)", re.DOTALL)
for i, line in enumerate(open('pdf_text_tika.txt')):
for match in re.finditer(pattern, line):
print ('Found on line %s: %s' % (i+1, match.group()))
Đầu ra:
Tìm thấy trên dòng 1305: NOMEAR JOSIAS CARLOS BORRHER làm hàng hóa em comissão
Tìm thấy trên dòng 1316: NOMEAR RAFAEL DOS SANTOS PASSAGEM para máy tập o hàng
Trả lời
Bạn có thể sử dụng MULTILINEchế độ sử dụng regex đơn giản hơn này :
^NOMEAR.+(?:\n.+)*
Trong python:
import re
pattern = re.compile(r'^NOMEAR.+(?:\n.+)*', re.MULTILINE)
with open('pdf_text_tika.txt', 'r') as file:
data = file.read()
print (pattern.findall(data))
Bản trình diễn RegEx
Sử dụng mẫu này:
(NOMEAR (?:.+\n)+)
Và mã này:
import re
pattern = re.compile(r'(NOMEAR (?:.+\n)+)')
text = 'NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão\n' \
'OTHER TEXT GOES HERE\n' \
'....................\n' \
'020007/002832/2020.\n\n' \
'EXONERAR DOUGLAS ALVES BORRHER do cargo em comissão\n' \
'OTHER TEXT GOES HERE\n' \
'....................\n' \
'020007/002832/2020.\n\n' \
'NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo\n' \
'OTHER TEXT GOES HERE\n' \
'....................\n' \
'020007/002832/2020.'
print(pattern.findall(text))
Đầu ra là (tôi đã định dạng các dòng mới để dễ đọc hơn vì tất cả đều nằm trong một dòng):
['NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão\n
OTHER TEXT GOES HERE\n
....................\n
020007/002832/2020.\n',
'NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo\n
OTHER TEXT GOES HERE\n
....................\n']
Bạn đang cố gắng tìm 2 kết quả phù hợp trong văn bản mẫu của mình; tức là, 2 phần bắt đầu bằng NOMEAR và kết thúc bằng dấu chấm, theo sau là 2 dòng mới hoặc cuối toàn bộ văn bản?
import re
text = """NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.
EXONERAR DOUGLAS ALVES BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.
NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
OTHER TEXT GOES HERE
....................
020007/002832/2020."""
pattern = re.compile("NOMEAR (?:.*?).(?:\n\n|\Z)", re.DOTALL)
matches = re.findall(pattern, text)
print("".join(matches))
import re
t = """NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.
EXONERAR DOUGLAS ALVES BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.
NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
OTHER TEXT GOES HERE
....................
020007/002832/2020."""
r = re.compile(r'(?=NOMEAR)(.*?)(?<=\d[.])', flags=re.S)
for i in r.finditer(t):
print(i.group(0))
NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.
NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
OTHER TEXT GOES HERE
....................
020007/002832/2020.