Skip to content
Advertisement

grab specific field value from the string using regex

I’ve a text file, from that I have extracted these two paragraph block. The text example is given below:

Text Example:

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 .

From the above text block I want to grab the bold values only from each paragraph as a individual row.

What I have tried:

filter_data_nomear = ['NOMEAR ISABELLE FERREIRA ZARONI, ID FUNCIONAL Nºn5100796-7, para exercer, com validade a contar de 16 de novembronde 2020, o cargo em comissão de Assessor, símbolo DAS-7, da Sub-nsecretaria de Concessões e Parcerias, da Secretaria de Estado denPlanejamento 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 paranexercer, com validade a contar de 16 de novembro de 2020, o cargonem comissão de Assessor, símbolo DAS-7, da Secretaria de Estadonde 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 novembronde 2020, o cargo em comissão de Assistente II, símbolo DAI-6, danSecretaria 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 emncomissão de Assistente II, símbolo DAI-6, da Secretaria de Estado denPlanejamento e Gestão, anteriormente ocupado por Edson Carneironda 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]

My Current Output:

['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 .']

My current output is almost ok but having issue with multiple replace() and some time this static replace is breaking my code also. So is there other way I can achieve that using regex matching on those bold text?

Advertisement

Answer

To get the values in bold, you might use 3 capturing groups with an alternation:

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

In parts

  • b A word boundary to prevent the word being part of a longer word
  • (?: Non capture group
    • (?:NOMEAR|d[ea]|por) Match one of NOMEAR de da por
    • ([^,]+?) Capture group 1, match any char except , non greedy
    • (?: e Gestão)?, Optionally match e Gestão and match a ,
    • | Or
    • ([A-Zd]+-d+) Capture in group 2 matching 1+ times either A-Z or a digit and - and 1+ digits
    • | Or
    • SEI- ([d /]+)b Match SEI- , capture in group 3 one of the listed followed by a word boundary
  • ) Close non capture group

Regex demo | Python demo

For example

import re

regex = r"b(?:(?:NOMEAR|d[ea]|por) ([^,]+?)(?: e Gestão)?,|([A-Zd]+-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 novembronde 2020, o cargo em comissão de Assessor, símbolo DAS-7, da Sub-nsecretaria de Concessões e Parcerias, da Secretaria de Estado denPlanejamento 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 paranexercer, com validade a contar de 16 de novembro de 2020, o cargonem comissão de Assessor, símbolo DAS-7, da Secretaria de Estadonde 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 novembronde 2020, o cargo em comissão de Assistente II, símbolo DAI-6, danSecretaria 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 emncomissão de Assistente II, símbolo DAI-6, da Secretaria de Estado denPlanejamento e Gestão, anteriormente ocupado por Edson Carneironda 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)

Output

['ISABELLE FERREIRA ZARONI', '5100796-7', '16 de novembronde 2020', 'Assessor', 'DAS-7', 'Sub-nsecretaria de Concessões e Parcerias', 'Secretaria de Estado denPlanejamento', 'Vinicius dos San-ntos Silva', '5108029-0']
['KARINE MATOS DIAS', '5092869-4', '16 de novembro de 2020', 'Assessor', 'DAS-7', 'Secretaria de Estadonde Planejamento', 'Amauri Ferrei-nra do Carmo', '5099579-0']
['ROSIONE FERNANDES DE SÁ', '4413710-9', '16 de novembronde 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 denPlanejamento', 'Edson Carneironda Silva', '570136-8']
Advertisement