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