我正在开发一些代码来从ActiveSubInfoList
中提取所有项,这些项位于{}之间。目前,我正在尝试创建一个正则表达式来匹配预期的输出。在下面,您可以找到示例文本和所需的输出
示例文本:
SubscriptionController:
mLastISubServiceRegTime=1591226711086
defaultSubId=43564
defaultDataSubId=1
defaultVoiceSubId=1
defaultVideoSubId=-1
defaultSmsSubId=1
defaultDataPhoneId=456456
defaultVoicePhoneId=65463456
defaultSmsPhoneId=4562546
++++++++++++++++++++++++++++++++
ActiveSubInfoList:
{id=1, iccId=xxxxxxx simSlotIndex=-1 carrierId=529 displayName=Claro BR carrierName=Claro }
{id=2, iccId=yyyyyyyyy simSlotIndex=-1 carrierId=530 displayName=Vivo carrierName=Vivo nameSource=1 }
++++++++++++++++++++++++++++++++
AllSubInfoList:
{id=1, iccId=kkkkkkkkk simSlotIndex=-1 carrierId=529 displayName=Claro BR carrierName=Claro BR nameSource=1 }
{id=2, iccId=uuuuuuuuu simSlotIndex=-1 carrierId=530 displayName=Vivo carrierName=Vivo nameSource=1 }
2020-06-03T20:25:11.107 - [SubscriptionController] init by Context
2020-06-03T20:25:14.301 - [clearSubInfoRecord]+ iccId: slotIndex:0
2020-06-03T20:25:14.338 - [clearSubInfoRecord]+ iccId: slotIndex:1
2020-06-03T20:25:14.360 - [sendDefaultChangedBroadcast] broadcast default subId changed phoneId=ppp subId=bbb
++++++++++++++++++++++++++++++++
样本输出:
Match 1: id=1, iccId=xxxxxxx simSlotIndex=-1 carrierId=529 displayName=Claro BR carrierName=Claro
Match 2: id=2, iccId=yyyyyyyyy simSlotIndex=-1 carrierId=530 displayName=Vivo carrierName=Vivo nameSource=1
我现在有两个独立的正则表达式:
一个用于获取{}之间的所有文本
\{(.*?)\}
Match 1 id=1, iccId=xxxxxxx simSlotIndex=-1 carrierId=529 displayName=Claro BR carrierName=Claro
Match 2 id=2, iccId=yyyyyyyyy simSlotIndex=-1 carrierId=530 displayName=Vivo carrierName=Vivo nameSource=1
Match 3 id=1, iccId=kkkkkkkkk simSlotIndex=-1 carrierId=529 displayName=Claro BR carrierName=Claro BR nameSource=1
Match 4 id=2, iccId=uuuuuuuuu simSlotIndex=-1 carrierId=530 displayName=Vivo carrierName=Vivo nameSource=1
这个函数获取ActiveSubInfoList
和+
之间的所有文本
(?s)(?<=ActiveSubInfoList).*?(?=\+)
:
{id=1, iccId=xxxxxxx simSlotIndex=-1 carrierId=529 displayName=Claro BR carrierName=Claro }
{id=2, iccId=yyyyyyyyy simSlotIndex=-1 carrierId=530 displayName=Vivo carrierName=Vivo nameSource=1 }
我正在努力使这两个表达式一起工作以获得所需的输出
对于这个问题,我提出了以下解决方案:
其输出为:
要获得多个匹配项,可以使用PyPi regex module
这允许您使用
\G
锚来获得迭代匹配(?:
非捕获组^[^\S\r\n]*
字符串开头,后跟0+乘以除换行符以外的空白字符ActiveSubInfoList:
逐字匹配\r?\n[^\S\r\n]*{
匹配换行符,0+乘以除换行符和{
之外的空白字符|
或\G(?!^){
在上一个匹配中断言位置,而不是在字符串的开头)
封闭群(
捕获组1[^{}]+
匹配除{
或}
之外的任何字符的1+倍)
封闭群}[^{}]*
匹配}
和0+乘以除{
或}
以外的任何字符(?=[\s\S]*\n\+)
正向前瞻,断言右边是一条新行,后跟一个加号Regex demoPython demo
相关问题 更多 >
编程相关推荐