使用正则表达式python从文本中提取信息

时间:2019-12-21 06:55:04

标签: regex python-3.x pandas python-regex

我有短信

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。如何解决此问题,以便在两种情况下都可以使用单个模式正确提取信息。

3 个答案:

答案 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