Вот решение без регулярных выражений:
text <- "fsfs blabla Honda t Asus"
x <- strsplit(text, " ", T)[[1]]
x[substr(x, 1, 1) %in% LETTERS]
# [1] "Honda" "Asus"
Использование '\ b', как предложено senderle
import sys
import time
sys.stdout.write('name=')
last_lenght = 0
with open('names.txt') as names:
for name in names:
sys.stdout.write('\b' * last_lenght) # go back
sys.stdout.write(' ' * last_lenght) # clear last name
sys.stdout.write('\b' * last_lenght) # reposition
sys.stdout.write(name.strip())
sys.stdout.flush()
last_lenght = len(name.strip())
time.sleep(0.5)
Просто использование \r
не будет работать в этом случае, потому что это возвращает вас к началу строки, поэтому вам придется перепечатать всю строку. Кроме того, в некоторых системах (включая Windows, я думаю) оператор Python print
(функция в 3+) интерпретирует \r
как новую строку. Я считаю, что этот код должен быть системно-независимым.
import sys, time
with open('names.txt', 'r') as names:
prev_len = 0
for name in names:
sys.stdout.write('\r' + ' ' * prev_len)
sys.stdout.flush()
output_string = '\rname={}'.format(name.strip())
prev_len = len(output_string)
sys.stdout.write(output_string)
sys.stdout.flush()
time.sleep(0.3)
print
Вы также можете использовать \b
, который обычно перемещает курсор на одно место.
Как вы указали, необходимо перезаписать ранее напечатанную строку пробелами , что означает, что необходимо запомнить длину предыдущей строки. Думаю, имеет смысл инкапсулировать это состояние в объект. Вот намного более чистое решение, чем выше, которое использует эту стратегию:
import sys, time
class LineUpdater(object):
def __init__(self, outfile=None):
self.prev_len = 0
self.outfile = sys.stdout if outfile is None else outfile
def write(self, line):
line = line.strip()
output = '\r{:<{width}}'.format(line, width=self.prev_len)
self.prev_len = len(line)
self.outfile.write(output)
self.outfile.flush()
with open('names.txt', 'r') as names:
out = LineUpdater()
for name in names:
out.write('name={}'.format(name))
time.sleep(0.3)
print