我正在开发一些代码,用于从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 }我正在努力使这两个表达式一起工作,以获得所需的输出。
发布于 2020-06-08 20:05:52
要获得多个匹配,可以使用PyPi正则模。
这允许您使用\G锚点来获得迭代匹配。
(?:^[^\S\r\n]*ActiveSubInfoList:\r?\n[^\S\r\n]*{|\G(?!^){)([^{}]+)}[^{}]*(?=[\s\S]*\n\+)(?:非俘获群^[^\S\r\n]*开头,后面跟着0+,除换行符外,空格字符为ActiveSubInfoList:匹配\r?\n[^\S\r\n]*{匹配换行符,除换行符和{外,0+的时间为空白字符。|或\G(?!^){在上一次匹配时断言位置,而不是在字符串开始时断言位置。
)紧群( Capture group 1 [^{}]+匹配1+乘以除{或}以外的任何字符
)紧群}[^{}]*匹配}和0+乘以除{或}以外的任何字符(?=[\s\S]*\n\+)正向前看,断言右边的是一个换行符,后面跟着一个加号发布于 2020-06-08 19:42:54
对于这个问题,我提出了以下解决方案:
out= "Sample text from previous question"
active_sim_info = re.search(r"(?s)(?<=ActiveSubInfoList).*?(?=\+)", out, re.MULTILINE).group(0)
for sim in re.findall(r"\{(.*?)\}", active_sim_info, re.MULTILINE):
print(f">>>{sim}")这方面的产出是:
>>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=1https://stackoverflow.com/questions/62223777
复制相似问题