python regex khớp toàn bộ đoạn bao gồm cả dòng mới

Nov 25 2020

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

1 anubhava Nov 25 2020 at 18:11

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

1 VoidTwo Nov 25 2020 at 20:09

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']
brensnap Nov 25 2020 at 18:21

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))
HenryTjhia Nov 25 2020 at 18:22
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.