Подстрока с несколькими экземплярами одного и того же символа

1

Поэтому я использую USB-устройство Magtek, которое будет считывать информацию о карте,

На данный момент я могу провести карточку, и я получаю длинную строку информации, которая входит в текстовое поле 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

До сих пор, когда я пытался это сделать, он не смог повторно использовать "^"

Любые участники о том, как я могу разделить эту строку текста на отдельные переменные:

Номер карты

Имя

Фамилия

Дата окончания срока

  • 0
    Таким образом, там есть две строки, стек затрудняет его форматирование, он переносит текст из «B» в «^» (который продолжается на следующей строке) и сохраняет его в переменной self.creditnumber.
Теги:
python-3.x
tkinter

2 ответа

1
Лучший ответ

Regex будет работать для этого. Я не захватил все, потому что вы не детализировали, что, но вот пример захвата имени:

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>.+)\^

Этот вопрос может также заинтересовать вас в поиске чего-то дважды: Поиск нескольких вхождений строки в строке в Python

  • 1
    regex101.com/r/lAARCP/2 для полных групп
  • 0
    Я не могу отблагодарить вас достаточно! Извините, если мой вопрос был сложным или недостаточно хорошо объяснен, вы дали мне необходимые мне ресурсы!
Показать ещё 6 комментариев
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:])
  • 0
    Спасибо вам и за это! Я попытаюсь заново выучить регулярные выражения, а затем попробую это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню