python - 使用正则表达式抓取每次出现的内容
问题描述
用例
我想使用正则表达式来获取位置未知的一小部分 json 数据。虽然 Python 有一个 json 库,但是解析所有的 json 数据是很慢的。json 数据具有常规格式。
目标
对于 的每次出现1001
,我想抓取包含该出现的最里面的大括号中的内容
代码
import re
x = r'{123:{"a":100, "asdf":"example.com","at":1001},'\
'47289:{"a":20, "asdf":"test.org","at":20},}'
regex = r'{(.*?)1001(.*?)}'
print(re.match(regex, x).group(1))
期望的结果
{"a":100, "asdf":"example.com","at":1001}
实际结果
123:{"a":100, "asdf":"example.com","at":
问题
这个怎么做?如何快速做到这一点?
解决方案
不要使用.*?
,它会匹配任何字符,包括{
. 改为使用[^{]*?
。
您还需要使用re.search()
, not re.match()
,因为match()
仅匹配字符串的开头。请参阅re.search 和 re.match 有什么区别?.
要获得整个比赛,请使用.group(0)
. .group(1)
只返回匹配的部分[^}]*?
。
import re
x = r'{123:{"a":100, "asdf":"example.com","at":1001},'\
'47289:{"a":20, "asdf":"test.org","at":20},}'
regex = r'{([^{]*?)1001(.*?)}'
print(re.search(regex, x).group(0))
让它不贪心并不能解决问题,因为匹配是从左到右的。所以{
将匹配第一个{
,然后.*
将匹配所有内容,直到1001
,其中包括内部{
。
它对第二组按预期工作,因为非贪婪量词在第一组之前停止}
,因为它是从左到右工作的。
推荐阅读
- asp.net-core-2.1 - .Net Core 项目参考继承
- android - 在 Kotlin 中将 Singleton Service 转换为对象会使我的应用程序崩溃
- ruby-on-rails - 在Rails中的URL中为用户名添加符号前缀
- php - 如何从有条件的表中获取数据,该数据不能存在于其他表中
- php - 超过 10000 个条目的 JMS 序列化程序性能问题
- python - 使用键列表从字典中快速查找字典
- powershell - 如何使用 TFS rest api 3.2 版从 TFS 项目中获取测试用例
- rest - 为什么在 POST 执行相同操作时使用 PUT?特别是在 Laravel
- php - 试图从 URL 中提取 json,但不起作用
- mongodb - MapReduce 中的 Golang GlobalSign mgo 查询