Python中使用findall无法精准提取多行文本指定行的问题
精准提取目标EARFCN行的正则表达式修改方案
问题场景
原始调试文本如下:
dbg = ''' HPLMN(424-03) SIM_STATE(1) SLOT 1 WITH DDS SERVING PLMN(424-03) - LTE SERVICE(AVAILABLE-2) NW SEL: AUTO ATT# 0, TAU# 0 EMM(REGISTERED-4) TAC(524) LTE RRC: CONN BAND: 3 BW: 20.0MHZ EARFCN: 1850, PCI: 445 R0 RSRP: -70, RSRQ: -6, SNR:34 R1 RSRP: -61, RSRQ :-6, SNR:34 RSRP:-61, RSRQ:-5, SNR:35 TX PWR: 1 DBM PAGING_CYCLE: 640 MS MOD(QAM): DL:256QAM, UL: - CA ACTIVATED (S1)BAND:20,BW:15.0MHZ (S1)EARFCN:6375,PCI:445 (S1)RSRP:-60,RSRQ;-9,SNR:33 '''
需求是仅提取EARFCN: 1850, PCI: 445这一行,使用原正则表达式:
items=re.findall('^EARFCN.*',dbg,re.MULTILINE)
却返回了两行结果:
EARFCN: 1850, PCI: 445 (S1)EARFCN:6375,PCI:445
修改方案
正则表达式优化
将正则修改为精准匹配行首无前置字符的目标格式,基础版:
items = re.findall(r'^EARFCN: \d+, PCI: \d+$', dbg, re.MULTILINE)
如果需要兼容数字前后的空格,可使用更灵活的版本:
items = re.findall(r'^EARFCN:\s*\d+,\s*PCI:\s*\d+$', dbg, re.MULTILINE)
代码示例
import re dbg = ''' HPLMN(424-03) SIM_STATE(1) SLOT 1 WITH DDS SERVING PLMN(424-03) - LTE SERVICE(AVAILABLE-2) NW SEL: AUTO ATT# 0, TAU# 0 EMM(REGISTERED-4) TAC(524) LTE RRC: CONN BAND: 3 BW: 20.0MHZ EARFCN: 1850, PCI: 445 R0 RSRP: -70, RSRQ: -6, SNR:34 R1 RSRP: -61, RSRQ :-6, SNR:34 RSRP:-61, RSRQ:-5, SNR:35 TX PWR: 1 DBM PAGING_CYCLE: 640 MS MOD(QAM): DL:256QAM, UL: - CA ACTIVATED (S1)BAND:20,BW:15.0MHZ (S1)EARFCN:6375,PCI:445 (S1)RSRP:-60,RSRQ;-9,SNR:33 ''' # 精准提取目标行 items = re.findall(r'^EARFCN: \d+, PCI: \d+$', dbg, re.MULTILINE) print(items) # 输出: ['EARFCN: 1850, PCI: 445']
原理说明
^在re.MULTILINE模式下匹配行首,确保只有行开头就是EARFCN的行被匹配,直接排除带(S1)前缀的行\d+匹配数字内容,\s*匹配任意数量的空格(可选,用于兼容格式差异)$匹配行尾,确保整行符合目标格式,避免部分匹配的情况
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

