在文本块中获取相同的正则表达式组
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
,启用 .
匹配换行符
(?<=executados:.*?)
- 在当前位置之前,必须有 executados:
,然后是零个或多个字符
CNPJ
- 固定字符串
\W+
- 一个或多个非单词字符
(\d+\.\d+\.\d+/\d+-\d+)
- regex.findall
的返回值,第 1 组:一位或多位数字和两次 .
,然后是一位或多位数字,/
、one or more digits,
-` 和一位或多位数字。
【讨论】:
Moduleregex
非常棒,在某些情况下绝对有效。但是,用于 RE 处理的 Python 官方模块re
已警告non-support 用于固定宽度lookbehind。最好使用基于官方模块re
的fix-width lookbehind(即((?<=executados).)*
)。事实上,re
的性能比其他任何同行都更稳定,因为cpython 有 40k+ 颗星,而regex 只有几十颗。以上是关于在文本块中获取相同的正则表达式组的主要内容,如果未能解决你的问题,请参考以下文章
powershell Get-Matches()获取所有正则表达式匹配。回答问题“我如何遍历文本文件并打印每个林的所有匹配的正则表达式组