Python: объединяет отдельные числовые символы в тексте, но оставляет буквенные тексты - PullRequest
2 голосов
/ 27 мая 2019

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

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

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

Ответы [ 4 ]

2 голосов
/ 27 мая 2019

Использование Regex. -> re.sub с Lookbehind & Lookahead

Ex:

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 
1 голос
/ 27 мая 2019

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

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 в цикле.

0 голосов
/ 27 мая 2019
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
0 голосов
/ 27 мая 2019
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
...