带分组的Python regexp多个表达式

2024-09-30 10:39:15 发布

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

当被问及网络信息时,我试图匹配调制解调器给出的输出,结果如下:

Network survey started...

For BCCH-Carrier:
arfcn: 15,bsic: 4,dBm: -68

For non BCCH-Carrier:
arfcn: 10,dBm: -72
arfcn: 6,dBm: -78
arfcn: 11,dBm: -81
arfcn: 14,dBm: -83
arfcn: 16,dBm: -83

所以我有两种表达式要匹配,BCCH和non-BCCH。以下代码几乎可以正常工作:

match = re.findall('(?:arfcn: (\d*),dBm: (-\d*))|(?:arfcn: (\d*),bsic: (\d*),dBm: (-\d*))', data)

但似乎两个表达式都是匹配的,没有找到空白字段:

>>> match
[('', '', '15', '4', '-68'), ('10', '-72', '', '', ''), ('6', '-78', '', '', ''), ('11', '-81', '', '', ''), ('14', '-83', '', '', ''), ('16', '-83', '', '', '')]

有人能帮忙吗?为什么会有这样的行为?我试过改变表达的顺序,但没有成功。你知道吗

谢谢!你知道吗


Tags: 网络信息调制解调器for表达式matchnetworksurvey
2条回答

有一个包含5个组的表达式。你知道吗

在表达式的一个可选部分中有2个,而在另一个互斥部分中有3个,这一事实并没有改变这个事实。两组或三组中的任何一组都将是空的,这取决于您匹配的行。你知道吗

如果你必须用一个表达式来匹配任何一行,这是没有办法的。您可以使用命名组(并返回匹配组的字典)使其更易于管理,但最终总是会得到空组。你知道吗

这就是捕获组的工作方式。因为你有五个,所以总会有五个零件被退回。你知道吗

基于您的数据,我认为您可以通过使bsic部分成为可选的来简化regex。这样,每一行将返回三个部分,中间一个对于非BCCH载波是空的。你知道吗

match = re.findall('arfcn: (\d*)(?:,bsic: (\d*))?,dBm: (-\d*)', data)

相关问题 更多 >

    热门问题