【问题标题】:grab specific field value from the string using regex使用正则表达式从字符串中获取特定字段值
【发布时间】:2020-11-27 08:22:13
【问题描述】:

我有一个文本文件,从中我提取了这两个段落块。文本示例如下:

文本示例:

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,达 Sub-secretaria de Concessões e Parcerias, da Secretaria de Estado de Planejamento e Gestão, anteriormente ocupado por Vinicius dos Santos 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 Ferreira do Carmo,ID 功能编号 5099579-0。处理器 nº SEI- 1 2 0 0 0 1 / 0 1 4 6 11 / 2 0 2 0 .

从上面的文本块中,我只想从每个段落中获取 bold 值作为单独的行。

我的尝试

filter_data_nomear = ['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.', 'NOMEAR FRANCISCO DE ASSIS PINTO CAVALCANTE para exer-\ncer, com validade a contar de 16 de novembro de 2020, o cargo em\ncomissão de Assistente II, símbolo DAI-6, da Secretaria de Estado de\nPlanejamento e Gestão, anteriormente ocupado por Edson Carneiro\nda Silva, ID Funcional nº 570136-8. Processo nº SEI-\n120001/014825/2020.']

for i in filter_data_nomear:
    splited_ini = i.split(',')
    splited_ini = list(filter(lambda x: x != 'para exercer', splited_ini))
    splited = [x.strip() \
        .replace("\n",' ') \
        .replace('anteriormente ocupado por ','') \
        .replace('para exercer','') \
        .replace('anteriormente ocupado por ','') \
        .replace('NOMEAR','') \
        .replace('o cargo em comissão de ','') \
        .replace('ID FUNCIONAL Nº ','') \
        .replace('com validade a contar de ','') \ 
        .replace('ID Funcional ','') \
        .replace('Processo nº SEI-','') \
        .replace('símbolo ','') \
        .strip() \
        .replace(u"nº",'--') \ 
        .replace('para exer- cer','') \ 
        .strip() for x in splited_ini]

我当前的输出:

['ISABELLE FERREIRA ZARONI', '5100796-7', '16 de novembro de 2020', 'Assessor', 'DAS-7', 'da Sub- secretaria de Concessões e Parcerias', 'da Secretaria de Estado de Planejamento e Gestão', 'Vinicius dos San- tos Silva', 'n° 5108029-0.  1 2 0 0 0 1 / 0 1 4 6 11 / 2 0 2 0 .']

我当前的输出几乎没问题,但是多个replace() 有问题,有时这个静态替换也破坏了我的代码。那么有没有其他方法可以在那些粗体文本上使用正则表达式匹配来实现呢?

【问题讨论】:

  • regex101.com/r/wn5moF/3 你可以试试那个正则表达式,不确定它是否好,因此留下这个作为评论,当你遍历比赛时,你只需要检查第 6 组中的,
  • 您可以使用 3 个捕获组来获取所有不同的值 \b(?:(?:NOMEAR|d[ea]|por) ([^,]+?)(?: e Gestão)?,|((?:[A-Z]+|\d+)-\d+)|SEI- ([\d /]+) ) regex101.com/r/xN7CYm/1

标签: python regex


【解决方案1】:

要以粗体显示值,您可以交替使用 3 个捕获组:

\b(?:(?:NOMEAR|d[ea]|por) ([^,]+?)(?: e Gestão)?,|([A-Z\d]+-\d+)|SEI- ([\d /]+)\b)

部分

  • \b 防止单词成为较长单词的一部分的单词边界
  • (?:非捕获组
    • (?:NOMEAR|d[ea]|por) 匹配NOMEAR de da por 之一
    • ([^,]+?)捕获group 1,匹配除,非贪婪以外的任何字符
    • (?: e Gestão)?, 可选择匹配 e Gestão 并匹配 ,
    • |或者
    • ([A-Z\d]+-\d+)组 2 中捕获匹配 1 次以上的 A-Z 或一个数字以及 - 和 1 次以上的数字
    • |或者
    • SEI- ([\d /]+)\b 匹配 SEI- ,在第 3 组中捕获列出的其中之一,后跟单词边界
  • )关闭非捕获组

Regex demo | Python demo

例如

import re

regex = r"\b(?:(?:NOMEAR|d[ea]|por) ([^,]+?)(?: e Gestão)?,|([A-Z\d]+-\d+)|SEI- ([\d /]+)\b)"

filter_data_nomear = ['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.', 'NOMEAR FRANCISCO DE ASSIS PINTO CAVALCANTE para exer-\ncer, com validade a contar de 16 de novembro de 2020, o cargo em\ncomissão de Assistente II, símbolo DAI-6, da Secretaria de Estado de\nPlanejamento e Gestão, anteriormente ocupado por Edson Carneiro\nda Silva, ID Funcional nº 570136-8. Processo nº SEI-\n120001/014825/2020.']

for i in filter_data_nomear:
    result = []
    matches = re.finditer(regex, i, re.MULTILINE)
    for matchNum, match in enumerate(matches, start=1):
        for groupNum in range(0, len(match.groups())):
            groupNum = groupNum + 1
            if match.group(groupNum) is not None:
                result.append(match.group(groupNum))
    print(result)

输出

['ISABELLE FERREIRA ZARONI', '5100796-7', '16 de novembro\nde 2020', 'Assessor', 'DAS-7', 'Sub-\nsecretaria de Concessões e Parcerias', 'Secretaria de Estado de\nPlanejamento', 'Vinicius dos San-\ntos Silva', '5108029-0']
['KARINE MATOS DIAS', '5092869-4', '16 de novembro de 2020', 'Assessor', 'DAS-7', 'Secretaria de Estado\nde Planejamento', 'Amauri Ferrei-\nra do Carmo', '5099579-0']
['ROSIONE FERNANDES DE SÁ', '4413710-9', '16 de novembro\nde 2020', 'Assistente II', 'DAI-6', 'Estado de Planejamento', 'Luis Henrique Ferreira de Aquino', 'SEI-120001']
['FRANCISCO DE ASSIS PINTO CAVALCANTE para exer-\ncer', '16 de novembro de 2020', 'Assistente II', 'DAI-6', 'Secretaria de Estado de\nPlanejamento', 'Edson Carneiro\nda Silva', '570136-8']

【讨论】:

  • 几乎没问题,但在最后一部分有问题,请查看输出的第三个元素。我还需要在 SEI- 之后获取值作为新元素,例如。 regex101.com/r/E2sYnI/2
  • @AlwaysSunny 您可以命名所有 3 个组 regex101.com/r/9YA3Gu/1
  • @AlwaysSunny 我明白了,空格应该是\s。像这样试试regex101.com/r/xmqGRy/1
  • @AlwaysSunny 对于当前的问题,这也可能是让所有部分都在自己的捕获组中的选项regex101.com/r/GKCJMB/1
  • 好的,先生。感谢发帖
猜你喜欢
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 2021-03-23
  • 2023-01-17
  • 2019-05-02
  • 1970-01-01
相关资源
最近更新 更多