Решение 1)
Как предлагается в комментарии, просто найдите и замените " "
(2 пробела) на " "
(4 пробела).Это также может заменить пробелы в вашем коде, но это самое простое и быстрое решение.Остерегайтесь жестко закодированных строк с двойными пробелами, они сломаются.
Решение 2)
Регулярные выражения!В другом скрипте (или консоли) выполните:
import re
with open('my_script_with_2_spaces.py') as fp:
text = fp.read()
def gen_replacement_string(match):
print(match)
print(match.groups())
return ' '*(len(match.groups()[0])//2)
with open('my_script_with_4_spaces.py', 'w') as fp:
fp.write(re.sub(r'^((?: )+)', gen_replacement_string, text, flags=re.MULTILINE))
Что делает регулярное выражение?
^
соответствует началу строки (требуется MULTILINE
flag) - внешний
(...)
необходим, чтобы рассматривать ...
(его содержимое) как одну группу, поэтому я могу легко его извлечь (это match.groups()[0]
in gen_replacement_string
) - внутренняя
(?: )+
- это группа без захвата, повторенная один или более раз, которая соответствует двум пробелам
Итак, в общем, я сопоставлю все строки, содержащие только пробелы, с несколькими-длины двух, которые появляются в начале строки.Это требуемый отступ.
re.sub
принимает в качестве второго параметра функцию, которую я использую для динамической генерации строки замены, поскольку мы хотим, чтобы она имела ту же глубину отступа, что и оригинал.Это происходит в gen_replacement_string
.