如何从SMS文本字符串创建模式?

时间:2018-10-13 07:19:43

标签: python python-3.x python-2.7

我有一个示例短信“在商店名称上花费300.00卢比,卡号XXXX2123”。就像假设您在交易后通过移动设备收到的任何银行短信一样。

我需要用python编写一个健壮的程序。

我想到了以下解决方案,仅考虑给定的字符串。

def split_string(samplestring):
    list_string = samplestring.split(' ')
    return list_string


if __name__ == '__main__':
    samplestring = 'Spent Rs 300.00 at Shop Name from card number XXXX2123'

    list_string = split_string(samplestring)
    #print(list_string)

    print("Spent/Added:" + list_string[0])
    #print(list_string[0])

    print("Amount Type:"+ list_string[1])
    #print(list_string[1])

    print("Amount:"+ list_string[2])
    #print(list_string[2])

    print("Location where used:" + list_string[4] + list_string[5])
    #print(list_string[4] + list_string[5])

    print("Card Number:" + list_string[9])
    #print(list_string[9])

输出应类似于:

Spent/Added:Spent
Amount Type:Rs
Amount:300.00
Location where used:ShopName
Card Number:XXXX2123

但这在以下情况下不起作用: 1.如果商店名称为单工或消息中有任何其他字符,则此方法将无效 2.同样,它不适用于来自不同银行的不同类型的短信

2 个答案:

答案 0 :(得分:1)

以下代码适用于示例SMS:

import re
def split_str(s):
    print('Spent/Added:',re.sub('.*(Spent|Added).*', '\\1', s))
    print('Amount Type:', re.sub('.*?\s+?([a-zA-Z\W]+)\s+?[0-9]+.*', '\\1', s))
    print('Amount:',re.sub('.*?[A-Za-z\W]+(.*?)\sat.*', '\\1', s))
    print('Location where used:',re.sub('.*?at\s+(.*?)\s+from.*', '\\1', s))
    print('Card Number:',re.sub('.*?((X{4})([0-9]{4})).*?', '\\1', s))
    print('Full Card Number:',re.sub('.*?(([0-9]{4})\s+([0-9]{4})\s+([0-9]{4})\s+([0-9]{4})).*?', '\\1', s))

示例1:

s = 'Spent Rs 300.00 at Shop Name from card number XXXX2123'
split_str(s)

结果:

Spent/Added: Spent
Amount Type: Rs
Amount: 300.00
Location where used: Shop Name
Card Number: XXXX2123
Full Card Number: Spent Rs 300.00 at Shop Name from card number XXXX2123

示例2:

s = 'Spent $ 3 000 000 000.78 at Bgees & Inc. from card number 1111 2222 3333 4444'
split_str(s)

结果:

Spent/Added: Spent
Amount Type: $
Amount: 3 000 000 000.78
Location where used: Bgees & Inc.
Card Number: Spent $ 3 000 000 000.78 at Bgees & Inc. from card number 1111 2222 3333 4444
Full Card Number: 1111 2222 3333 4444

答案 1 :(得分:0)

您正在尝试将机器生成的短文本消息解析为特定值。

您可能要尝试创建一个正则表达式列表,当发现新的消息格式时,它们会随着时间的推移而逐渐建立。当您收到一条消息时,请尝试使用每个正则表达式解析它,直到匹配为止。如果没有匹配项,则创建警报以供以后查看,以便可以创建新的正则表达式。

您还可以建立源电话号码到期望的正则表达式的映射,但这可能只是一种优化,因为您可能从未在同一家银行看到新的电话号码。

样本'Spent Rs 300.00 at Shop Name from card number XXXX2123'的正则表达式可能是:

r'Spent Rs (\d+)\.(\d\d) at (.*) from card number (\d+)'