У меня есть несколько примеров строк, например:
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
Не удается соединить числа, разделенные пробелами, в первом и втором случае. Что я делаю неправильно?
Использование регулярного выражения. --> 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
в цикле.
Заработало, не хватало еще 1 инициализации.
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
Добавьте объяснение, чтобы удалить свой ответ из поста низкого качества.
О, я, должно быть, пропустил это. Проверит.