Python正则表达式具有分组的多个表达式

时间:2013-07-09 10:44:06

标签: python regex

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

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)

但似乎 BOTH 表达式正在匹配,未找到的字段留空:

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

愿任何人帮忙吗?为何如此行为?我试过改变表达式的顺序,没有运气。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

这就是捕获小组的工作方式。由于你有五个,所以总会有五个部分返回。

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

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