如果不匹配,正则表达式跳过值

时间:2021-06-17 09:13:25

标签: python regex

我正在使用以下正则表达式从文件中提取数据,只要我提取的数据包含正则表达式的所有 3 个元素,它就可以正常工作,如果没有(如果只有一个是乱七八糟的)正则表达式只是跳过数据,如果不匹配,我如何更改此行为以不跳过该值,而是将其填充为 0 或 null?

bC_NUMBER = 1
bS_ID = 1
bTRANSACTION_AMOUNT = 1
rC_NUMBER = r"number:\s(\d+\*+\d+).*?"
rS_ID = r"ID:\s*(\d*).*?"
rT_ID = r"ATM:\s(\w+).*?"
rT_AMOUNT = r"Total cash dispensed:\s*([a-zA-Z0-9]+)\s+([a-zA-Z0-9]+).*?"

regex = rC_NUMBER*bC_NUMBER+ rS_ID*bS_ID + rT_AMOUNT*bTRANSACTION_AMOUNT

示例输出:

[('99280*********8823', '182', '40000', 'MGA'), ('99280*********8823', '182', '40000', 'MGA')]

所需的输出:

[('99280*********8823', '182', '40000', 'MGA'),('6700*********8823', '177', 'null or 0', 'null or 0'), ('99280*********8823', '182', '40000', 'MGA')]

1 个答案:

答案 0 :(得分:1)

你可以使用正则表达式

(?s)Card number:\s(\d+\*+\d+)(?:(?!Card number:).)*?ID:\s*(\d*)(?:(?:(?!Card number:).)*?Total cash dispensed:\s*([a-zA-Z0-9]+)\s+([a-zA-Z0-9]+))?

参见regex demo

注意:1) .*? 变成了 (?:(?!Card number:).)*? 缓和的贪婪令牌,2) 最后一部分如果现在是可选的,(?:(?:(?!Card number:).)*?Total cash dispensed:\s*([a-zA-Z0-9]+)\s+([a-zA-Z0-9]+))? 和 3 ) 我正在使用 (?s)(在代码中,re.Sre.DOTALL)以便 . 可以匹配任何字符,包括换行符。

Python demo

import re
 
test_str = "YOUR_STRING_HERE"
 
bC_NUMBER = 1
bS_ID = 1
bTRANSACTION_AMOUNT = 1
rC_NUMBER = r"Card number:\s(\d+\*+\d+)"
rS_ID = r"(?:(?!Card number:).)*?ID:\s*(\d*)"
rT_ID = r"(?:(?!Card number:).)*?ATM:\s(\w+)"
rT_AMOUNT = r"(?:(?:(?!Card number:).)*?Total cash dispensed:\s*([a-zA-Z0-9]+)\s+([a-zA-Z0-9]+))?"
 
regex = rC_NUMBER*bC_NUMBER+ rS_ID*bS_ID + rT_AMOUNT*bTRANSACTION_AMOUNT
print( re.findall(regex, test_str, re.S) )

输出:

[('99280*********8823', '182', '40000', 'MGA'), ('6700*********8823', '177', '', ''), ('99280*********8823', '182', '40000', 'MGA')]