Как оставить определенные символы в текстовом файле питон
Есть папка со множеством папок и файлов, среди которых есть файлы txt. В этих файлах нужно оставить только определенные символы, определенные символы заменить на слова (например @ на собака) и удалить двойные пробелы. Вот, что написал для перебора файлов
import os
from pathlib import Path
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя!\'\"(),-.:;? '
names = os.listdir(os.getcwd())
for name in names:
fullname = os.path.join(os.getcwd(), name)
if os.path.isfile(fullname) and Path(fullname).suffix == '.txt':
with open(fullname) as f:
s = f.read()
Собственно, после этого нужно преобразовать строку s. Полагаю, для всего этого можно использовать регулярные выражения, но не могу понять как именно.
Ответы (1 шт):
def create_replacer():
import re
allowed = '''-a-z а-яё!'"(),.:;?'''
# тире важно оставить в самом начале (или в конце),
# т.к. посередине он воспринимается как спецсимвол для regex[...]
replace_table = {
'@': 'собака'
}
###
regex = r'[^' + allowed.replace(']', r'\]') + ']'
replacer = lambda match_obj: replace_table.get(match_obj.group(0), '')
def main_replacer(string):
string = re.sub(r'\s\s+', '', string)
return re.sub(regex, replacer, string, flags = re.IGNORECASE)
return main_replacer
###
replace = create_replacer()
string = '@ и еще @?:%№;%№ \n\n\n x'
print( replace(string) ) # собака и еще собака?:;x
[^перечисленое] — такое выражение одначает «всё, кроме перечисленных символов в квадратных скобках»
Исходную строку взял в три кавычки, чтобы не париться с экранированием кавычек.
'\s\s+': \s — любой пробельный символ (space), включая переносы строки. + — один или много раз подряд. Удалит всё пробельное, что встретится 2 или больше раз подряд.
main_replacer первым шагом удаляет все пробелы, вторым шагом производит удаление / замену всех лишних символов, для каждого совпадения вызывая функцию replacer, которая в виде первого аргумента получает объект совпадения.
match_obj.group(0) — совпавшая строка используется как ключ словаря. Если для него есть подготовленная замена - вернется она, иначе - '' по умолчанию.
P.s. комменатрий вначале кода надо бы оставить, чтобы не забыть про потенциальный источник бага. Или в начальной строке перечислить весь алфавит, а экранирование \- предусмотреть в коде.