Как мне найти и заменить (.) в начале строки в текстовом файле на регулярное выражение, чтобы затем удалить его?

#python

#python

Вопрос:

У меня есть программа, которая регистрирует нажатые клавиши, а затем записывает их в текстовый файл. Проблема в том, что (может быть лучший способ) У меня есть свой код для запуска новой строки ‘n’ каждый раз, когда нажимается a (.), Но точка переходит в следующую строку вместо того, чтобы оставаться в предыдущей строке. В принципе, я не хочу, чтобы файл .txt начинал каждую новую строку с .(.)

В коде у меня нет реализованного регулярного выражения, я надеюсь, вы поможете мне с этим, а затем удалите то, что находит регулярное выражение. Это будет новая строка, начинающаяся с (точка) .

 from unicurses import *
import os

def copy():
    stdscr = initscr()
    file = open("pressed_keys.txt", "a")  # open and append file
    true = True
    while true:
        key = getch()
        addstr(chr(key))
        if key == 46:  # (.) period
            file.write('.')
            file.write('n')
            # file.  >> something to delete the previous key pressed
        elif key not in (27, 10):  # ESC key | ENTER
            addstr('ASCII code for %s is %s n' % (chr(key), str(key)))  # prints the key code to the terminal window
            file.write(chr(key))  # writes the pressed key to the 'file'
        else:
            file.close()
            true = False
            endwin()


if os.path.isfile('./pressed_keys.txt'):
    #  comment the next line to not clear the file when the program runs
    open('pressed_keys.txt', 'w').close()
    copy()
else:
    file = open('pressed_keys.txt', 'w ')  # create a file if it does not exist
    copy()
  

Комментарии:

1. Разве вы не можете просто использовать lstrip('.') в каждой строке?

2. Где и как я мог бы реализовать это в коде?

3. @Austin, lstrip удаляет не только первое . (хотя, возможно, это то, чего хочет OP).

4. Имею ли я на это право? Вы хотите удалить этот символ после его записи в файл, в который вы пишете, потому что вы не понимаете, как он вообще туда попадает?

5. @Steve Когда я запускаю программу и набираю «прочитайте это.и это». Я получаю «прочитай это». затем в следующей строке я получаю «.и это». В этой второй строке я получаю (точку), от которой я хочу избавиться.

Ответ №1:

Вы сказали, что у вас проблема, потому что он пишет точку в начале строки.

Проблема в том, что вы используете if ... if ... , но вы должны if ... elif ... в

     if key == 46:  # (.) period
        file.write('.')
        file.write('n')
        # file.  >> something to delete the previous key pressed
    if key != 27 | 10:  # ESC key | ENTER
        addstr('ASCII code for %s is %s n' % (chr(key), str(key)))  # prints the key code to the terminal window
        file.write(chr(key))
  

Сначала if сравните dot с 46 , и он записывает "n" в файл, но после следующего if сравнения dot с != 27 тем, что является true, поэтому оно записывается dot в новой строке.

Вы должны использовать if ... elif ... , чтобы остановить его.

     if key == 46:  # (.) period
        file.write('.')
        file.write('n')
        # file.  >> something to delete the previous key pressed
    elif key != 27 and key != 10:  # ESC key | ENTER
        addstr('ASCII code for %s is %s n' % (chr(key), str(key)))  # prints the key code to the terminal window
        file.write(chr(key))
  

Кстати: key != 27 | 10 работает не так, как вы ожидаете, что вам нужно key != 27 and key != 10 или key not in (27, 10)

Комментарии:

1. при записи (27, 10) это в основном означает (27 или 10) или (27 и 10)? Также я получаю пробел после вместо точки в начале каждой строки. Если бы я должен был ввести пару предложений, я бы нажал ПРОБЕЛ после (точки), но поскольку программа записывает в новую строку после нажатия (точки). Мне не нужно, чтобы пробелы отображались, даже если я их печатаю.

2. это кортеж (27, 10) , поэтому он ничего не говорит. Но key not in (27, 10) работает как key != 27 and key != 10 . Без not ( key in (27, 10) ) это будет работать так key == 27 or key == 10 — так с not ним and , без not него or

3. если вам не нужно пространство, вам нужно создать if оператор, чтобы пропустить его. если вам не нужен пробел после period них, вы должны запомнить предыдущий key и проверить if key == 32 and previous_key == 46: pass

4. Как мне запомнить предыдущий ключ? Это ново для меня, как и кортеж. Я пытаюсь создать этот регистратор ключей, собирая информацию, а не из пошагового видео.

5. как вы помните текущий ключ? у вас есть переменная key для этого — ie. previous_key . Прежде чем получить новый ключ key = getch() , вы должны сохранить старый ключ в этой переменной previous_key = key . Также может потребоваться некоторое значение для key at start, поэтому вы можете установить key = None перед while True