python - 使用正则表达式获取模式中的不同组
问题描述
好的,不久前我问了一个问题,但我忘记了正则表达式非常微妙,并且我以错误的格式显示了字符串。
问题是,我收到一个巨大的杂乱无章的文本,都在一行中。
在这一行中,我需要 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))
任何帮助将不胜感激。
解决方案
假设人名总是大写,前面有数字(或:
第一次出现)和空格:
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')
推荐阅读
- r - 如何修复 lm 模型无法使用的 tidy 功能
- javascript - 从 API 获取数据时处理 useEffect 中的错误
- python - 如何在 django rest 框架中设计 ArrayField?
- python - 使用顺序数据对少数类进行过度采样
- html - 如何设置相对于其父元素固定的伪元素的样式。所以在调整伪元素大小时将与父元素一起移动
- git - 替换文件时Git合并不显示冲突
- node.js - 无法在 Visual Studio Code 中更改 node.js 中的环境变量
- timestamp - TDengine 是否支持插入具有更旧时间戳值的数据?
- c++ - 从 wchar_t* 中获取最后一个令牌
- windows - ForFiles 命令不适用于参数 /D +xx