Python 正则表达式不产生预期结果
我使用Python2.7ReFindall来查找匹配案例列表,但是第一个案例得到的比我想要的更多。 我的源代码在这里,从长字符串中找到一些导入数据 结果如下:Python 正则表达式不产生预期结果,python,regex,Python,Regex,我使用Python2.7ReFindall来查找匹配案例列表,但是第一个案例得到的比我想要的更多。 我的源代码在这里,从长字符串中找到一些导入数据 结果如下: ('1', 'GLOBAL_SETTINGS') ('10', 'TX_MULTI_VERIFICATION 2437 DSSS-1 NON_HT BW-20 TX1') ('12', 'TX_MULTI_VERIFICATION 2412 CCK-11 NON_HT BW-20 TX1') 第1、10、12项。这不是我想要的。
('1', 'GLOBAL_SETTINGS')
('10', 'TX_MULTI_VERIFICATION 2437 DSSS-1 NON_HT BW-20 TX1')
('12', 'TX_MULTI_VERIFICATION 2412 CCK-11 NON_HT BW-20 TX1')
第1、10、12项。这不是我想要的。我要第9、11、12项
import re
s='''
Summary
1.GLOBAL_SETTINGS ____________________________________________________________
ANALYSIS_11AC_AMPLITUDE_TRACKING : 0
ANALYSIS_11AC_DECODE_PSDU : 0
PER_WAVEFORM_PREFIX_11AG :
PER_WAVEFORM_PREFIX_11B :
PER_WAVEFORM_PREFIX_11N :
VSA_PORT_CHAIN_MAP : 0,0,0,0
VSG_PORT_CHAIN_MAP : 0,0,0,0
Test Time = 0.001 s
:[Info] Function completed.
2.CONNECT_IQ_TESTER __________________________________________________________
APP_ID : 1
APT_ENABLE : 0
DH_ENABLE : 0
:
IQ_NXN_VERSION :
IQ_ZIGBEE_SIGNAL_VERSION :
TEST_MANAGER_VERSION :3.0.0 (2012-8-24)
3.INSERT_DUT _________________________________________________________________
RELOAD_DUT_DLL : 0
CONNECTION_STRING : 192.168.100.1:2390
DUT_DLL_FILENAME : QCA.dll
EEPROM_FILENAME :
OPTION_STRING :
Test Time = 1.020 s
DUT_VERSION :QLIB V6
ERROR_MESSAGE :[Info] Function completed.
VDUT_VERSION :3.0.0 (2012-8-24)
4.INITIALIZE_DUT _____________________________________________________________
Test Time = 0.308 s
DUT_DRIVER_INFO :5.1
DUT_NAME :QCA_
ERROR_MESSAGE :[Info] Function completed.
5.LOAD_PATH_LOSS_TABLE _______________________________________________________
RX_PATH_LOSS_FILE : path_loss.csv
TX_PATH_LOSS_FILE : path_loss.csv
Test Time = 0.001 s
ERROR_MESSAGE :[Info] Function completed.
6.TX_CALIBRATION _____________________________________________________________
CABLE_LOSS_DB_1 : 0.00 dB
CABLE_LOSS_DB_2 : 0.00 dB
CABLE_LOSS_DB_3 : 0.00 dB
CABLE_LOSS_DB_4 : 0.00 dB
DUT_SETTLE_TIME : 0.00 MS
SAMPLING_TIME_US : 150.00 uS
TX_CAL_TIMEOUT_MS : 600000.00 MS
Test Time = 33.392 s
CABLE_LOSS_DB_2 : 14.90 dB (, )
CAL_RESULT_1 :
CAL_RESULT_2 :
CAL_RESULT_3 :
CAL_RESULT_4 :
ERROR_MESSAGE :[Info] Function completed.
7.TX_CLPC_CALIBRATION ________________________________________________________
CABLE_LOSS_DB_1 : 0.00 dB
CABLE_LOSS_DB_2 : 0.00 dB
CABLE_LOSS_DB_3 : 0.00 dB
CABLE_LOSS_DB_4 : 0.00 dB
SAMPLING_TIME_US : 150.00 uS
TX_CAL_TIMEOUT_MS : 600000.00 MS
Skipped by ALWAYS_SKIP
8.FINALIZE_EEPROM ____________________________________________________________
COMMIT_EEPROM_TEMPLATE : 20
COMPRESS : 1
MEMORY_SIZE : 0
MEMORY_TYPE : 5
OVERWRITE : 1
SECTION_MASK_BIT0_ALL : 0
SECTION_MASK_BIT10_SDIO_PID : 0
S
SECTION_MASK_BIT6_5G_CONTROL_DATA : 0
SECTION_MASK_BIT7_CONFIG_DATA : 0
SECTION_MASK_BIT8_CUSTOMER_DATA : 0
SECTION_MASK_BIT9_USB_VID_PID : 0
Skipped by ALWAYS_SKIP
9.TX_MULTI_VERIFICATION 2412 DSSS-1 NON_HT BW-20 TX1 _________________________
ARRAY_HANDLING_METHOD : 0
BSS_FREQ_MHZ_PRIMARY : 2412 MHz
BSS_FREQ_MHZ_SECONDARY : 0 MHz
CH_FREQ_MHZ : 2412 MHz
PHASE_ERR_1 : 0.37 Degree (, )
PHASE_NOISE_RMS_ALL : 0.00 Degree (, )
POWER_AVG_1 : 21.07 dBm (, )
POWER_AVG_DBM : 21.07 dBm (19.00, 25.00)--[failed]
SYMBOL_CLK_ERR : -5.76 ppm (, )
TX_POWER_DBM : 22.00 dBm (, )
VIOLATION_PERCENT : 0.00 % (0.00, 0.00)
SPECTRUM_FLATNESS_RAW_DATA:Not Display dB (, )
SPECTRUM_RAW_DATA_X :Not Display dBm/100kHz (, )
SPECTRUM_RAW_DATA_Y :Not Display dBm/100kHz (, )
ERROR_MESSAGE :[Info] Function completed.
10.TX_MULTI_VERIFICATION 2437 DSSS-1 NON_HT BW-20 TX1 ________________________
ARRAY_HANDLING_METHOD : 0
BSS_FREQ_MHZ_PRIMARY : 2437 MHz
BSS_FREQ_MHZ_SECONDARY : 0 MHz
CH_FREQ_MHZ : 2437 MHz
CH_FREQ_MHZ_PRIMARY_20MHz : 0 MHz
ENABLE_EVM : 1
ENABLE_MASK : 1
ENABLE_POWER : 0
ENABLE_SPECTRUM : 1
NUM_STREAM_11AC : 1
TX1 : 1
TX2 : 0
TX3 : 0
POWER_AVG_1 : 20.83 dBm (, )
POWER_AVG_DBM : 20.83 dBm (19.00, 25.00)
SYMBOL_CLK_ERR : -6.03 ppm (, )
TX_POWER_DBM : 22.00 dBm (, )
VIOLATION_PERCENT : 0.00 % (0.00, 0.00)
SPECTRUM_FLATNESS_RAW_DATA:Not Display dB (, )
SPECTRUM_RAW_DATA_X :Not Display dBm/100kHz (, )
SPECTRUM_RAW_DATA_Y :Not Display dBm/100kHz (, )
ERROR_MESSAGE :[Info] Function completed.
11.TX_MULTI_VERIFICATION 2472 DSSS-1 NON_HT BW-20 TX1 ________________________
ARRAY_HANDLING_METHOD : 0
BSS_FREQ_MHZ_PRIMARY : 2472 MHz
BSS_FREQ_MHZ_SECONDARY : 0 MHz
PHASE_ERR_1 : 0.37 Degree (, )
PHASE_NOISE_RMS_ALL : 0.00 Degree (, )
POWER_AVG_1 : 20.86 dBm (, )
POWER_AVG_DBM : 20.86 dBm (19.00, 25.00)--[failed]
SYMBOL_CLK_ERR : -6.26 ppm (, )
TX_POWER_DBM : 22.00 dBm (, )
VIOLATION_PERCENT : 0.00 % (0.00, 0.00)
SPECTRUM_FLATNESS_RAW_DATA:Not Display dB (, )
SPECTRUM_RAW_DATA_X :Not Display dBm/100kHz (, )
SPECTRUM_RAW_DATA_Y :Not Display dBm/100kHz (, )
ERROR_MESSAGE :[Info] Function completed.
12.TX_MULTI_VERIFICATION 2412 CCK-11 NON_HT BW-20 TX1 ________________________
ARRAY_HANDLING_METHOD : 0
BSS_FREQ_MHZ_PRIMARY : 2412 MHz
BSS_FREQ_MHZ_SECONDARY : 0 MHz
CH_FREQ_MHZ : 2412 MHz
CH_FREQ_MHZ_PRIMARY_20MHz : 0 MHz
PHASE_ERR_1 : 0.97 Degree (, )
PHASE_NOISE_RMS_ALL : 0.42 Degree (, )
POWER_AVG_1 : 21.14 dBm (, )
POWER_AVG_DBM : 21.14 dBm (19.00, 25.00)--[failed]
SYMBOL_CLK_ERR : -6.06 ppm (, )
TX_POWER_DBM : 22.00 dBm (, )
VIOLATION_PERCENT : 0.00 % (0.00, 0.00)
SPECTRUM_FLATNESS_RAW_DATA:Not Display dB (, )
SPECTRUM_RAW_DATA_X :Not Display dBm/100kHz (, )
SPECTRUM_RAW_DATA_Y :Not Display dBm/100kHz (, )
ERROR_MESSAGE :[Info] Function completed.'''
if __name__ == '__main__':
t=re.findall(r'(\d{1,2})\.(.{50,100}_{15}).+?\[failed\]',s,re.M|re.DOTALL)
print t
更新
如果坚持使用正则表达式跟踪失败,可以执行以下操作:
for i in s.split('\n'):
number = re.findall(r'^\d+', i)
if number: failure = re.findall(r'^(\d+)\.(.*?)\s_{2,}', i)
if 'failed' in i:
print(failure)
返回:
[('9', 'TX_MULTI_VERIFICATION 2412 DSSS-1 NON_HT BW-20 TX1')]
[('11', 'TX_MULTI_VERIFICATION 2472 DSSS-1 NON_HT BW-20 TX1')]
[('12', 'TX_MULTI_VERIFICATION 2412 CCK-11 NON_HT BW-20 TX1')]
您可以看到此正则表达式的一种形式正在运行。您可以使用re.split将其拆分为多个部分,然后在每个部分中查找[failed]字符串:
splitted = re.split(r'(\d{1,2})\.(.*)(?= _{3,})', text)
failed = [(splitted[i-2], splitted[i-1]) for i, s in enumerate(splitted) if re.search(r'\[failed\]', s)]
failed
# [('9', 'TX_MULTI_VERIFICATION 2412 DSSS-1 NON_HT BW-20 TX1'),
# ('11', 'TX_MULTI_VERIFICATION 2472 DSSS-1 NON_HT BW-20 TX1'),
# ('12', 'TX_MULTI_VERIFICATION 2412 CCK-11 NON_HT BW-20 TX1')]
此处,re.split将文本拆分为三个子组:
1.第1组:分段编号
2.第2组:章节标题
3.第3组:本节正文
如果第3组中有匹配项,请返回第1组和第2组-因此,拆分[i-2]和拆分[i-1]有些人在遇到问题时会想:“我知道,我将使用正则表达式。”现在他们有两个问题。您是否在这个庞大的多行字符串的子集上尝试过您的方法?您应该对自己进行bug测试,如果您需要帮助,请提供问题的最低版本。如:?。。。但为什么是正则表达式?这似乎不是一个适合正则表达式的问题。只有一个方法尝试搜索子集?获得正确的结果?最好使用^$|\Z而不是两个空格。我的意思是。。。虽然这是OP 9,11和12。。。这显然不是他们精神上想要的。他们想要[失败的]零件。如果我不知道哪一项包括失败?mybe还有其他项目,包括失败。问题的失败部分并不十分清楚。我已经相应地更新了我的答案以适应。