首页 > 解决方案 > 使用正则表达式获取模式中的不同组

问题描述

好的,不久前我问了一个问题,但我忘记了正则表达式非常微妙,并且我以错误的格式显示了字符串。

问题是,我收到一个巨大的杂乱无章的文本,都在一行中。

在这一行中,我需要 2 个不同的“块”:“最频繁的发送者”和“最频繁的接收者”

正如我所说,一切都在一条直线上,有点像这样:

 string = """ 
Huge text etc etc etc Most frequent senders: NAME OF THE PERSON - 01.234.567/0001-89 (SOME RANDOM UPPERCASE TEXT) - 14 time(s) in total of: R$10.000,00 NAME OF THE PERSON - 012.345.678-90 (SOME RANDOM UPPERCASE TEXT) - 30 times in total of: R$10.000,00 NAME OF THE PERSON - 01.234.567/0001-89 (SOME RANDOM UPPERCASE TEXT) - 10 times in total of: R$10.000,00 Most frequent recipients:     NAME OF THE PERSON - 01.234.567/0001-89 (SOME RANDOM UPPERCASE TEXT) - 14 time(s) in total of: R$10.000,00 NAME OF THE PERSON - 012.345.678-90 (SOME RANDOM UPPERCASE TEXT) - 30 time(s) in total of: R$10.000,00 NAME OF THE PERSON - 01.234.567/0001-89 (SOME RANDOM UPPERCASE TEXT) - 10 time(s) in total of: R$10.000,00 More text after this.  """

如您所见,这是非常混乱的,但这是我收到它的方式。

基本上我要做的是获取人的姓名、ID(可以有 2 个模式 xx.xxx.xxx/0001-xx 或 xxx.xxx.xxx-xx)、次数和金额(以巴西雷亚尔为 R$)。

我找到了一种获取 IDS 的方法,但仅此而已。

    r = re.compile(r' [0-9]{3}\.?[0-9]{3}\.?[0-9]{3}\-?[0-9]{2} | [0-9]{2}\.?[0-9]{3}\.?[0-9]{3}\/?[0-9]{4}\-?[0-9]{2} ')

print(r.findall(string))

任何帮助将不胜感激。

标签: pythonregex

解决方案


假设人名总是大写,前面有数字(或:第一次出现)和空格:

r = re.compile(r'(?<=[\d:])\s+([A-Z ]*) - ([0-9]{3}\.?[0-9]{3}\.?[0-9]{3}\-?[0-9]{2}|[0-9]{2}\.?[0-9]{3}\.?[0-9]{3}\/?[0-9]{4}\-?[0-9]{2}).*?- (\d*)\s.*?: R\$([\d\.,]+)')

注意:您的原始正则表达式在 ID 之后/之前有不必要的空格。你应该得到更多的匹配这个。

您还可以使用以下命令获得更漂亮的输出:

print(*r.findall(string), sep='\n')

推荐阅读