具有相同字符的多个实例的子字符串

时间:2018-07-29 17:32:14

标签: python python-3.x tkinter

所以我正在使用Magtek USB读卡器,该读卡器将读取卡信息,

截至目前,我可以刷卡,并且可以获得一长串信息,这些信息将进入Tkinter Entry文本框,如下所示

%B8954756016548963^LAST/FIRST INITIAL^180912345678912345678901234?;8954756016548963=180912345678912345678901234?

所有数据均已随机化,但这就是格式

我有一个tkinter按钮(它从输入框以我上面包含的格式获取文本并运行它)

    def printCD(self):
        print(self.carddata.get())
        self.card_data_get = self.carddata.get()
        self.creditnumber = 
        self.card_data_get[self.card_data_get.find("B")+1:
        self.card_data_get.find("^")]
        print(self.creditnumber)
        print(self.card_data_get.count("^"))

这将输出:

%B8954756016548963^LAST/FIRST INITIAL^180912345678912345678901234?;8954756016548963=180912345678912345678901234?
8954756016548963

这不会产生任何问题,但是如果我想获取接下来的两个变量firstname和lastname

我需要重用self.variable.find(“ ^”),因为在 LAST 之前和 INITIAL 之后使用格式

到目前为止,当我尝试执行此操作时,仍无法重用“ ^”

任何了解如何将文本字符串拆分为单个变量的人:

卡号

名字

姓氏

到期日期

2 个答案:

答案 0 :(得分:1)

正则表达式将为此工作。我没有捕获所有内容,因为您没有详细说明这是什么,但这是捕获名称的示例:

import re
data = "%B8954756016548963^LAST/FIRST INITIAL^180912345678912345678901234?;8954756016548963=180912345678912345678901234?"

matches = re.search(r"\^(?P<name>.+)\^", data)

print(matches.group('name'))
# LAST/FIRST INITIAL

如果您对正则表达式不熟悉,可以使用以下方法测试模式匹配:https://regex101.com/r/lAARCP/1和入门教程:https://regexone.com/

但基本上,我正在搜索(两个胡萝卜之间有。+的任何一项或多项,^)。

实际上,由于您提到了第一个和最后一个是分开的,因此您将使用此正则表达式:

\^(?P<last>.+)/(?P<first>.+)\^

这个问题也可能使您感兴趣:两次发现一些东西:Finding multiple occurrences of a string within a string in Python

答案 1 :(得分:0)

如果发现正则表达式很困难,则可以将问题分成较小的部分,然后一次进行攻击:

data = '%B8954756016548963^LAST/FIRST INITIAL^180912345678912345678901234?;8954756016548963=180912345678912345678901234?'

pieces = data.split('^')    # Divide in pieces, one of which contains name

for piece in pieces:
    if '/' in piece:
        last, the_rest = piece.split('/')
        first, initial = the_rest.split()
        print('Name:', first, initial, last)
    elif piece.startswith('%B'):
        print('Card no:', piece[2:])