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



我使用以下正则表达式从文件中提取数据,只要提取的数据包含正则表达式的所有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')]

您可以使用类似的正则表达式

(?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演示。

注意: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演示:

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')]

相关内容

最新更新