Python: объединение разделенных числовых символов в тексте, но оставить буквенные тексты

У меня есть несколько примеров строк, например:

sample_lt1 = 'CANCEL Bitcoin kev 1 96 35 2 0 5 7 5 6'
sample_lt2 = 'CANCEL Bitcoln key 1 6 3 5 20 5 7 56 Cash 2 9 00'
sample_lt3 = 'CANCEL Bitcein key 0 1 5 0 0 4 4 1 6 Cash '

Я пытаюсь соединить числа, разделенные пробелами в строке, но оставить часть буквенных символов. Желаемый результат для этих выборочных входных данных будет следующим:

sample_out1 = 'CANCEL Bitcoin kev 19635205756'
sample_out2 = 'CANCEL Bitcoln key 1635205756 Cash 2900'
sample_out3 = 'CANCEL Bitcein key 015004416 Cash ' # Removal of last space is ok.

До сих пор я сделал это:

def ReForm(lt):
    lts = lt.split()
    c = 0
    new = []
    temp = []
    while c<len(lts):
        if lts[c].isnumeric():
            temp.append(lts[c])
        else:
            if temp:
                s = ''.join(temp)
                new.append(s)
            new.append(lts[c])
        c += 1
    ret = ' '.join(new)
    return ret

Вывод, данный моим кодом:

CANCEL Bitcoin kev
CANCEL Bitcoln key 1635205756 Cash
CANCEL Bitcein key 015004416 Cash

Не удается соединить числа, разделенные пробелами, в первом и втором случае. Что я делаю неправильно?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
65
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Использование регулярного выражения. --> re.sub с Lookbehind & Lookahead

Бывший:

import re

sample_lt1 = 'CANCEL Bitcoin kev 1 96 35 2 0 5 7 5 6'
sample_lt2 = 'CANCEL Bitcoln key 1 6 3 5 20 5 7 56 Cash 2 9 00'
sample_lt3 = 'CANCEL Bitcein key 0 1 5 0 0 4 4 1 6 Cash '

data = [sample_lt1, sample_lt2, sample_lt3]

for i in data:
    print(re.sub(r"(?<=\d) (?=\d)", "", i))

Выход:

CANCEL Bitcoin kev 19635205756
CANCEL Bitcoln key 1635205756 Cash 2900
CANCEL Bitcein key 015004416 Cash 

Следующее исправляет вашу программу:

def ReForm(lt):
    lts = lt.split()
    c = 0
    new = []
    temp = []
    while c<len(lts):
        if lts[c].isnumeric():
            temp.append(lts[c])
        else:
            if temp:
                s = ''.join(temp)
                new.append(s)
                temp = []
            new.append(lts[c])
        c += 1
    if temp:
        s = ''.join(temp)
        new.append(s)
    ret = ' '.join(new)
    return ret

В вашем цикле отсутствовал запасной случай, когда последний символ был числом. В этом случае ваш список temp не был добавлен к new. Еще одна вещь, которой не хватало, — это случай, когда temp добавлялся к общей строке, но строка продолжала с другим содержимым. Этого можно добиться повторной инициализацией temp в цикле.

О, я, должно быть, пропустил это. Проверит.

Heiko Becker 27.05.2019 14:59

Заработало, не хватало еще 1 инициализации.

Heiko Becker 27.05.2019 15:00
def ReForm(lt):
    lts = lt.split()
    c = 0
    new = []
    temp = []
    while c<len(lts):
        if lts[c].isnumeric():
            temp.append(lts[c])
        else:
            if temp:
                s = ''.join(temp)
                new.append(s)
                temp = []
            new.append(lts[c])
        c += 1  
    if temp:
        s = ''.join(temp)
        new.append(s)                   
    ret = ' '.join(new)
    return ret
import re
s1 = 'CANCEL Bitcoin kev 1 96 35 2 0 5 7 5 6'
print(re.sub(r"(?<=\d) (?=\d)", "", s1))
CANCEL Bitcoin kev 19635205756
s2 = 'CANCEL Bitcoln key 1 6 3 5 20 5 7 56 Cash 2 9 00'
print(re.sub(r"(?<=\d) (?=\d)", "", s2))
CANCEL Bitcoln key 1635205756 Cash 2900

Добавьте объяснение, чтобы удалить свой ответ из поста низкого качества.

Harsha Biyani 27.05.2019 15:47

Другие вопросы по теме