【问题标题】:Regex match full paragraph block when it contains a string inside it当其中包含字符串时,正则表达式匹配整个段落块
【发布时间】:2020-11-26 02:06:53
【问题描述】:

我有一个文本文件,如果其中包含一个字符串,我想匹配整个段落块,但我当前的正则表达式不能匹配包括新行在内的整个段落。

文本示例:

NOMEAR ISABELLE FERREIRA ZARONI, ID FUNCIONAL Nº
5100796-7, para exercer, com validade a contar de 16 de novembro
de 2020, o cargo em comissão de Assessor, símbolo DAS-7, da Sub-
secretaria de Concessões e Parcerias, da Secretaria de Estado de
Planejamento e Gestão, anteriormente ocupado por Vinicius dos San-
tos Silva, ID Funcional n° 5108029-0. Processo nº SEI-
1 2 0 0 0 1 / 0 1 4 6 11 / 2 0 2 0 .

NOMEAR KARINE MATOS DIAS, ID FUNCIONAL Nº 5092869-4 para
exercer, com validade a contar de 16 de novembro de 2020, o cargo
em comissão de Assessor, símbolo DAS-7, da Secretaria de Estado
de Planejamento e Gestão, anteriormente ocupado por Amauri Ferrei-
ra do Carmo, ID Funcional nº 5099579-0. Processo nº SEI-
1 2 0 0 0 1 / 0 1 4 6 11 / 2 0 2 0 .

NOMEAR ROSIONE FERNANDES DE SÁ, ID FUNCIONAL Nº
4413710-9, para exercer, com validade a contar de 16 de novembro
de 2020, o cargo em comissão de Assistente II, símbolo DAI-6, da
Secretaria de Estado de Planejamento e Gestão, anteriormente ocu-
pado por Luis Henrique Ferreira de Aquino, ID Funcional nº 1914315-
0. Processo nº SEI-120001/014825/2020.

EXONERAR, com validade a contar de 16 de novembro de 2020,
LUIS HENRIQUE FERREIRA DE AQUINO, ID FUNCIONAL Nº
1914315-0, do cargo em comissão de Assistente II, símbolo DAI-6, da
Secretaria de Estado de Planejamento e Gestão. Processo nº SEI-
120001/014825/2020.

从上面的文本块中,如果它包含 da Secretaria de Estado de Planejamento e Gestão,我想匹配整个段落所以预期的 输出 是获得所有段落,因为它们都在单行或多行中包含该句子

NOMEAR ISABELLE FERREIRA ZARONI,ID FUNCIONAL Nº 5100796-7, para exercer, com validade a contar de 16 de novembro de 2020, o cargo em comissão de Assessor, símbolo DAS-7, da Sub- secretaria de Concessões e Parcerias, da Secretaria de Estado de Planejamento e Gestão, anteriormente ocupado por Vinicius dos San- tos Silva, ID Funcional n° 5108029-0。处理器 nº SEI- 1 2 0 0 0 1 / 0 1 4 6 11 / 2 0 2 0。

NOMEAR KARINE MATOS DIAS,ID FUNCIONAL Nº 5092869-4 段 exercer, com validade a contar de 16 de novembro de 2020, o cargo em comissão de Assessor, símbolo DAS-7, da Secretaria de Estado de Planejamento e Gestão, anteriormente ocupado por Amauri Ferrei- ra do Carmo,ID 功能编号 5099579-0。处理器 nº SEI- 1 2 0 0 0 1 / 0 1 4 6 11 / 2 0 2 0。

NOMEAR ROSIONE FERNANDES DE SÁ,ID FUNCIONAL Nº 4413710-9, para exercer, com validade a contar de 16 de novembro de 2020, o cargo em comissão de Assistente II, símbolo DAI-6, da Secretaria de Estado de Planejamento e Gestão, anteriormente ocu- pado por Luis Henrique Ferreira de Aquino, ID Funcional nº 1914315- 0. 处理器编号 SEI-120001/014825/2020。

EXONERAR,com 验证 2020 年 11 月 16 日的通知, LUIS HENRIQUE FERREIRA DE AQUINO,ID FUNCIONAL Nº 1914315-0, do cargo em comissão de Assistente II, símbolo DAI-6, da Secretaria de Estado de Planejamento e Gestão。处理器 nº SEI- 120001/014825/2020.

我的尝试

import re
pattern = re.compile(r'.*Secretaria de Estado de Planejamento e Gestão.*', re.MULTILINE)

with open('pdf_text.txt', 'r') as file:
    data = file.read()
matched = pattern.findall(data)
print (matched)

我当前的输出:

['Secretaria de Estado de Planejamento e Gestão, anteriormente ocu-', 'Secretaria de Estado de Planejamento e Gestão。处理器 nº SEI-']

此输出有两个问题,首先它与此处的完整段落块不匹配,然后不获取句子存在于单行或多行中的所有块。 p>

【问题讨论】:

标签: python regex regex-lookarounds regex-group regex-greedy


【解决方案1】:

一种不使用re的方法:

[i for i in text.split("\n\n") 
 if "da Secretaria de Estado de Planejamento e Gestão" in i.replace("\n", " ")]

输出:

['NOMEAR ISABELLE FERREIRA ZARONI, ID FUNCIONAL Nº\n5100796-7, para exercer, com validade a contar de 16 de novembro\nde 2020, o cargo em comissão de Assessor, símbolo DAS-7, da Sub-\nsecretaria de Concessões e Parcerias, da Secretaria de Estado de\nPlanejamento e Gestão, anteriormente ocupado por Vinicius dos San-\ntos Silva, ID Funcional n° 5108029-0. Processo nº SEI-\n1 2 0 0 0 1 / 0 1 4 6 11 / 2 0 2 0 .',
 'NOMEAR KARINE MATOS DIAS, ID FUNCIONAL Nº 5092869-4 para\nexercer, com validade a contar de 16 de novembro de 2020, o cargo\nem comissão de Assessor, símbolo DAS-7, da Secretaria de Estado\nde Planejamento e Gestão, anteriormente ocupado por Amauri Ferrei-\nra do Carmo, ID Funcional nº 5099579-0. Processo nº SEI-\n1 2 0 0 0 1 / 0 1 4 6 11 / 2 0 2 0 .',
 'NOMEAR ROSIONE FERNANDES DE SÁ, ID FUNCIONAL Nº\n4413710-9, para exercer, com validade a contar de 16 de novembro\nde 2020, o cargo em comissão de Assistente II, símbolo DAI-6, da\nSecretaria de Estado de Planejamento e Gestão, anteriormente ocu-\npado por Luis Henrique Ferreira de Aquino, ID Funcional nº 1914315-\n0. Processo nº SEI-120001/014825/2020.',
 'EXONERAR, com validade a contar de 16 de novembro de 2020,\nLUIS HENRIQUE FERREIRA DE AQUINO, ID FUNCIONAL Nº\n1914315-0, do cargo em comissão de Assistente II, símbolo DAI-6, da\nSecretaria de Estado de Planejamento e Gestão. Processo nº SEI-\n120001/014825/2020.']

【讨论】:

  • 太简单了,太聪明了:)
【解决方案2】:

你可以试试这个:

text='da Secretaria de Estado de Planejamento e Gestão'

REGEX_text=re.compile(re.sub('\s','\\\s+',f'{text}'), re.IGNORECASE)
REGEX_paragraph=re.compile(r'^((?:[^\n]+\n)+)',flags=re.MULTILINE)

filtered_Paragraphs= [x for x in REGEX_paragraph.findall(data) if REGEX_text.search(x)]
for paragraph in filtered_Paragraphs:
    print(paragraph)

通知

  • data 是你的 text-example
  • REGEX_text 在 exec re.compile 之后是 da\s+Secretaria\s+de\s+Estado\s+de\s+Planejamento\s+e\s+Gestão

请参阅demo-regex1demo-regex2 了解更多信息。

【讨论】:

  • 好主意@Heo,请把for paragraph in Filtred_Paragraph: 中的“Filtred_Paragraph”更正为“Filtred_Paragraphs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
相关资源
最近更新 更多