我有短信
text = 'dear customer your account xx9052 has been debited with inr25697.50 on 23-nov-18 info
bil001582495861 icici bank the available balance is inr 363.25'
在这里,我正在尝试从文本中提取诸如帐号,金额,日期和可用余额之类的信息。
我通过以下正则表达式进行了尝试:
pattern = 'your account (.*) has been debited with (.*) on (.*) info (.*) available balance is (.*\d)$'
if (re.search(pattern, text, re.IGNORECASE)):
print(re.search(pattern, text, re.IGNORECASE).group(1)), \
print(re.search(pattern, text, re.IGNORECASE).group(2)), \
print(re.search(pattern, text, re.IGNORECASE).group(3)), \
print(re.search(pattern, text, re.IGNORECASE).group(5))
我得到了预期的结果:
xx9333
inr 25697.50
23-nov-18
inr 363.25
但是当文本稍加修改时,我正面临这种正则表达式模式的问题,
text = 'dear customer your account xx9052 has been debited with inr 25697.50 on 23-nov-18 info bil 001582495861 icici bank the available balance is inr 363.25 for dispute call 04033667777'
使用相同的正则表达式会给我结果:
xx9333
inr 25697.50
23-nov-18
inr 363.25 for dispute call 04033667777
使用额外的信息提取余额,而余额应仅为inr 363.25。如何解决此问题,以便在两种情况下都可以使用单个模式正确提取信息。
答案 0 :(得分:2)
我建议分开提取信息,而不要使用单个模式。
例如:
要获取金额,您可以使用正则表达式-([\d]+\.[\d]+)
它将从所需的字符串中获取十进制数字,然后您可以为其他信息(例如帐号和日期)创建正则表达式。
更新:
如果要使用相同的模板,则将正则表达式更改为
pattern = 'your account (.*) has been debited with (.*) on (.*) info (.*) available balance is (.*[\d]+\.[\d]+)'
答案 1 :(得分:1)
模式:
(.*\d)$
将匹配以小数结尾的任何字符串,因此在这种情况下,它将返回直到该电话号码末尾的字符串。如果可能的话,您可以尝试使模式更加具体,例如创建一个包含“ inr”的模式,或者也许单独获取所有数字,例如使用:
re.findall('\d*\.?\d+',text)
将返回一个数字列表,该数字列表的小数点前后都有数字。
来源:https://www.tutorialspoint.com/Extract-decimal-numbers-from-a-string-in-Python
答案 2 :(得分:1)
输入文字
text = 'dear customer your account xx9052 has been debited with inr 25697.50 on 23-nov-18 info bil 001582495861 icici bank the available balance is inr 363.25 for dispute call 04033667777'
使用以下正则表达式:
r('your account (.*) has been debited with (.*) on (.*) info bil (.*) icici bank the available balance is (.*[\d]+\.[\d]+)')
输出:
xx9052
inr 25697.50
23-nov-18
001582495861
inr 363.25