0

当被问及网络信息时,我试图匹配调制解调器给出的输出,它看起来像这样:

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 和非 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', '', '', '')]

有人可以帮忙吗?为什么会有这样的行为?我试过改变表达式的顺序,但没有运气。

谢谢!

4

2 回答 2

1

这就是捕获组的工作方式。因为你有五个,所以总会有五个部分被退回。

根据您的数据,我认为您可以通过将bsic部分设为可选来简化您的正则表达式。这样,每一行将返回三个部分,中间一个对于非 BCCH 运营商是空的。

match = re.findall('arfcn: (\d*)(?:,bsic: (\d*))?,dBm: (-\d*)', data)
于 2013-07-09T10:51:20.080 回答
1

您有一个包含 5 个组的表达式。

您在表达式的一个可选部分中有 2 个,而在相互排斥的其他部分中有另外 3 个,这一事实并没有改变这一事实。根据您匹配的行,其中 2 个或 3 个组将是空的。

如果您必须将任一行与一个表达式匹配,则无法解决此问题。您可以使用命名组(并返回匹配组的字典)以使其更易于管理,但您总是会得到空组。

于 2013-07-09T10:47:31.657 回答