让多个正则表达式一起工作以匹配复杂的字符串集

2024-10-02 18:17:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一些代码来从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 }

我正在努力使这两个表达式一起工作以获得所需的输出


Tags: 文本bridmatchdisplaynamexxxxxxxvivoyyyyyyyyy
2条回答

对于这个问题,我提出了以下解决方案:

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=1

要获得多个匹配项,可以使用PyPi regex module

这允许您使用\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(?!^){在上一个匹配中断言位置,而不是在字符串的开头
  • )封闭群
  • (捕获组1
    • [^{}]+匹配除{}之外的任何字符的1+倍
  • )封闭群
  • }[^{}]*匹配}和0+乘以除{}以外的任何字符
  • (?=[\s\S]*\n\+)正向前瞻,断言右边是一条新行,后跟一个加号

Regex demoPython demo

相关问题 更多 >