在块文本中获取特定的模式组



我试图获得这些值-10.547.889/0001-85,00.219.460/0001-05按组分开,但条件是模式需要从executada(s):开始,不能像:r' - CNPJ:? (?P<cnpj>d+.d+.d+/d+-d+)'。所以,我们的想法是从executada(s)开始,得到这个组。

目前,我的模式只得到第一组,我不知道如何得到所有的。

我使用Python 3.8.5和regex库(不re)。

text = """
Solicite-se ao BANCO CENTRAL, via protocolo digital - SISBACEN ,
o BLOQUEIO de créditos existentes até o limite de R$ 30.257,45 (trinta mil, duzentos e
cinquenta e sete reais e quarenta e cinco centavos) da(s) executada(s): J.HENRIQUE
GALVANI COMERCIO DE ROUPAS - ME - CNPJ 10.547.889/0001-85, Riane Confecções de
Roupas Ltda - ME - CNPJ: 00.219.460/0001-05, Jose Henrique Galvani - CPF: 234.846.406-34
e Heliane Leonel Raymundo Galvani - CPF: 813.460.347-53, porventura
existentes junto a instituições financeiras, incluindo cartões de crédito, agenciadores
de pagamento, administradores de consórcio."""
pattern = r'executadw(?:(s))?W+(?:[p{L}s-.]+CNPJW+(?P<cnpj>d+.d+.d+/d+-d+),)+'
for item in regex.finditer(pattern, text, flags=regex.I|regex.S):
print(item.groupdict())

{"cnpj":"00.219.460/0001-05"}

I was waiting for:

{"cnpj":"00.219.460/0001-05"}

{"cnpj":"10.547.889/0001-85"}

那么,有人能帮我解决这个麻烦吗?

使用regex模块,您可以使用G锚:

(?:executadw(?:(s))?W+|G(?!^)),?[p{L}s.-]+CNPJW+K(?P<cnpj>d+.d+.d+/d+-d+)

在部分中,模式匹配:

  • (?:非抓包组
    • executadw匹配executad,一个字字符(也可以是a字符,如果这是唯一的可能)
    • (?:(s))?W+可选匹配(s)和1+非单词字符
    • |
    • G(?!^)断言当前位置在前一个匹配的末尾,而不是字符串的开始
  • )关闭非捕获组
  • ,?[p{L}s.-]+匹配可选的,和1+倍的任意字母、空白字符、.-
  • CNPJW+匹配CNPJ和1+次非单词字符
  • K清除匹配缓冲区以忘记到目前为止匹配的内容
  • (?P<cnpj>d+.d+.d+/d+-d+)Named groupcnpj,捕获所需格式

Regex demo | Python demo

对于示例数据,可以省略regex.S标志,因为W也匹配换行符。

import regex
pattern = r"(?:executadw(?:(s))?W+|G(?!^)),?[p{L}s.-]+CNPJW+K(?P<cnpj>d+.d+.d+/d+-d+)"
text = ("Solicite-se ao BANCO CENTRAL, via protocolo digital - SISBACEN ,n"
"o BLOQUEIO de créditos existentes até o limite de R$ 30.257,45 (trinta mil, duzentos en"
"cinquenta e sete reais e quarenta e cinco centavos) da(s) executada(s): J.HENRIQUEn"
"GALVANI COMERCIO DE ROUPAS - ME - CNPJ 10.547.889/0001-85, Riane Confecções den"
"Roupas Ltda - ME - CNPJ: 00.219.460/0001-05, Jose Henrique Galvani - CPF: 234.846.406-34n"
"e Heliane Leonel Raymundo Galvani - CPF: 813.460.347-53, porventuran"
"existentes junto a instituições financeiras, incluindo cartões de crédito, agenciadoresn"
"de pagamento, administradores de consórcio.")
for item in regex.finditer(pattern, text):
print(item.groupdict())

输出
{'cnpj': '10.547.889/0001-85'}
{'cnpj': '00.219.460/0001-05'}

检查是否适合您:

text = """
Solicite-se ao BANCO CENTRAL, via protocolo digital - SISBACEN ,
o BLOQUEIO de créditos existentes até o limite de R$ 30.257,45 (trinta mil, duzentos e
cinquenta e sete reais e quarenta e cinco centavos) da(s) executada(s): J.HENRIQUE
GALVANI COMERCIO DE ROUPAS - ME - CNPJ 10.547.889/0001-85, Riane Confecções de
Roupas Ltda - ME - CNPJ: 00.219.460/0001-05, Jose Henrique Galvani - CPF: 234.846.406-34
e Heliane Leonel Raymundo Galvani - CPF: 813.460.347-53, porventura
existentes junto a instituições financeiras, incluindo cartões de crédito, agenciadores
de pagamento, administradores de consórcio."""
pattern = r'[0-9]{2}.?[0-9]{3}.?[0-9]{3}/?[0-9]{4}-?[0-9]{2}'
# cut text to start right after executada(s)
text = text.split("executada(s)")[1]
cnpjs = [{"cnpj": cnpj} for cnpj in regex.findall(pattern, text)]
print(cnpjs)

最新更新