python - Python 正则表达式捕获跨越多行的多个匹配项
问题描述
我正在尝试提取 adb 输出的数据块,这些数据块使用 python 跨越多行re
。
示例数据为:
* ReceiverList{ac5847f 494 system/1000/u-1 local:ecc819e}
app=494:system/1000 pid=494 uid=1000 user=-1
Filter #0: BroadcastFilter{db24c4c}
Action: "android.app.action.DEVICE_POLICY_MANAGER_STATE_CHANGED"
Action: "android.intent.action.USER_PRESENT"
Action: "android.intent.action.USER_ADDED"
Action: "android.intent.action.USER_REMOVED"
AutoVerify=false
* ReceiverList{d0a75c1 494 system/1000/u-1 local:22946a8}
app=494:system/1000 pid=494 uid=1000 user=-1
Filter #0: BroadcastFilter{19b2166}
Action: "android.intent.action.USER_ADDED"
Action: "android.intent.action.USER_REMOVED"
AutoVerify=false
Filter #1: BroadcastFilter{e1e7ca7}
Action: "android.intent.action.PACKAGE_ADDED"
Action: "android.intent.action.PACKAGE_REMOVED"
Scheme: "package"
AutoVerify=false
* ReceiverList{4b668d3 691 com.android.systemui/10016/u0 remote:523b2c2}
app=691:com.android.systemui/u0a16 pid=691 uid=10016 user=0
Filter #0: BroadcastFilter{bcd1c10}
Action: "android.media.VOLUME_CHANGED_ACTION"
Action: "android.media.STREAM_DEVICES_CHANGED_ACTION"
Action: "android.media.RINGER_MODE_CHANGED"
Action: "android.media.INTERNAL_RINGER_MODE_CHANGED_ACTION"
Action: "android.media.STREAM_MUTE_CHANGED_ACTION"
Action: "android.os.action.ACTION_EFFECTS_SUPPRESSOR_CHANGED"
Action: "android.intent.action.CONFIGURATION_CHANGED"
Action: "android.intent.action.SCREEN_OFF"
Action: "android.intent.action.CLOSE_SYSTEM_DIALOGS"
AutoVerify=false
...
我试图提取* ReceiverList...
以最后一个开头和结尾的每组数据AutoVerify=false
。一些数据集有多个AutoVerify=false
. 最终输出应反映[*ReceiverList...AutoVerify... , *ReceiverList...Autoverify...]
到目前为止,我尝试过的一些事情是:
re.findall(r'^\*.Receiver.+', data, flags=re.M)
这会产生所需的效果,但第一行只有一个。re.findall(r'^\*.Receiver.+AutoVerify=\w+$', data, flags=re.M|re.DOTALL)
,这捕获了两组数据。re.findall(r'^\*.Receiver.+(?=AutoVerify=\w+)', data, flags=re.M)
,这也不够。
请注意,在示例数据集中,有两个AutoVerify=false
. 在第二组中,我想包括所有数据,直到下一次* ReceiverList
开始。
解决方案
使用split
前瞻分割换行符\* ReceiverList
:
re.compile("\r?\n(?=\* ReceiverList)").split(s)
推荐阅读
- git - Git克隆错误:RPC失败 - curl 28 操作太慢
- python - 使用 ForeignKey 在 Django 中查询集过滤器()
- html - CYPRESS:检查列表中的每个项目
- docker - 尝试启动 Docker 容器时出现用户错误
- swift - 无法转换 Observable 类型的类型值
到预期的参数类型 Observable - mysql - 有没有办法通过 mysqlworkbench 更改存储过程所需的权限?
- php - 按顺序对这些变量进行排序(将单词转换为等于其长度的数字)。(使用条件)
- python - 为什么 Python 不能为我识别“kivy”模块?
- swift - 在 Combine 中链接 n 个请求
- rust - 如何通过回调管理生命周期