首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让多个regex表达式一起工作,以匹配复杂的字符串集

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

Stack Overflow用户
提问于 2020-06-05 20:39:35
回答 2查看 80关注 0票数 0

我正在开发一些代码,用于从ActiveSubInfoList提取所有项,这些项介于{}之间。目前,我正在尝试创建一个正则表达式来匹配预期的输出。下面,您可以找到一个示例文本和所需的输出。

样本文本:

代码语言:javascript
复制
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
++++++++++++++++++++++++++++++++

样本输出:

代码语言:javascript
复制
   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

我现在有两个分开的正则表达式:

一个用来获取{}之间的所有文本。

代码语言:javascript
复制
\{(.*?)\}


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+之间获取所有文本的

代码语言:javascript
复制
(?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 }

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-08 20:05:52

要获得多个匹配,可以使用PyPi正则模

这允许您使用\G锚点来获得迭代匹配。

代码语言:javascript
复制
(?:^[^\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\+)正向前看,断言右边的是一个换行符,后面跟着一个加号

Regex演示 x- Python演示

票数 1
EN

Stack Overflow用户

发布于 2020-06-08 19:42:54

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

代码语言:javascript
复制
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}")

这方面的产出是:

代码语言:javascript
复制
>>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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62223777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档