在文本块中获取相同的正则表达式组

Posted

技术标签:

【中文标题】在文本块中获取相同的正则表达式组【英文标题】:getting same regex groups inside a block of text 【发布时间】:2022-01-01 07:43:19 【问题描述】:

我试图编写一个模式来将每个 CPNJ 组放入此文本块中,但条件是,需要以 executados: 开头并以 CNPJ 组结束。但是,我的模式总是排在最后一组,我不知道我应该为它的作品做些什么。

答案getting specific groups of patterns inside a block text无效!

模式:(?:executados\:)[\pL\s\D\d]+CNPJ\W+(?P<cnpj>\d+\.\d+\.\d+\/\d+-\d+)

要测试的字符串:

Dados dos executados:
1. FOO TEST STRING LTDA., CNPJ: 88.888.888/8888-88,
2. ANOTHER TEST STRING LTDA LTDA LTDA - ME, CNPJ: 99.999.999/9999-99,
3. FOO TEST STRING LTDA., CPF: 999.999.999-99,
4. FOO TEST STRING LTDA., CPF: 999.999.999-99.
Como medida de economia e celeridade processuais, atribuo a

我会得到值'cnpj': ['88.888.888/8888-88', '99.999.999/9999-99'],这种方式只是最后一个。

【问题讨论】:

使用像ideone.com/tVQC61这样的常规方法 @WiktorStribiżew 我看到了,但我需要尊重这个条件,在这种情况下,不是简单的 CNPJ 组,而是在 executados: 之后获取所有 CNPJ 组 是的,你只得到那些!你注意到text[text.index("executados:"):])了吗? 嗯,不好意思,我现在看到了!但是,可以在模式而不是代码中指定它吗? 仅如 TheFourthBird 所示,带有 PyPi 正则表达式模块。见this demo。 【参考方案1】:

您可以将 PyPi 正则表达式模块与正则表达式一起使用

(?s)(?<=executados:.*?)CNPJ\W+(\d+\.\d+\.\d+/\d+-\d+)

请参阅regex demo。

这里是Python demo:

import regex
text = """Dados dos executados:
1. FOO TEST STRING LTDA., CNPJ: 99.999.999/9999-99,
2. ANOTHER TEST STRING LTDA LTDA LTDA - ME, CNPJ: 99.999.999/9999-99,
3. FOO TEST STRING LTDA., CPF: 999.999.999-99,
4. FOO TEST STRING LTDA., CPF: 999.999.999-99.
Como medida de economia e celeridade processuais, atribuo a"""
print( regex.findall(r'(?s)(?<=executados:.*?)CNPJ\W+(\d+\.\d+\.\d+/\d+-\d+)', text) )

屈服

['99.999.999/9999-99', '99.999.999/9999-99']

正则表达式匹配

(?s) - regex.DOTALL,启用 . 匹配换行符 (?&lt;=executados:.*?) - 在当前位置之前,必须有 executados:,然后是零个或多个字符 CNPJ - 固定字符串 \W+ - 一个或多个非单词字符 (\d+\.\d+\.\d+/\d+-\d+) - regex.findall 的返回值,第 1 组:一位或多位数字和两次 .,然后是一位或多位数字,/one or more digits, -` 和一位或多位数字。

【讨论】:

Module regex 非常棒,在某些情况下绝对有效。但是,用于 RE 处理的 Python 官方模块re 已警告non-support 用于固定宽度lookbehind。最好使用基于官方模块re的fix-width lookbehind(即((?&lt;=executados).)*)。事实上,re 的性能比其他任何同行都更稳定,因为cpython 有 40k+ 颗星,而regex 只有几十颗。

以上是关于在文本块中获取相同的正则表达式组的主要内容,如果未能解决你的问题,请参考以下文章

powershell Get-Matches()获取所有正则表达式匹配。回答问题“我如何遍历文本文件并打印每个林的所有匹配的正则表达式组

使用正则表达式在文本中搜索 UUID

使用正则表达式获取用换行符分隔的单词之间的文本

ios正则表达式

关于Linux,用户,组,权限,文本处理工具,正则表达式,vim文本编辑器

用正则表达式regexp进行高级搜索数据