zelsky
@zelsky

Ошбка в модуле re raise error, v # invalid expression?

Придумал себе задачу. Удалять все стили которые не использую из цсс файла.
При работе с простинькими файлами типо
.class {
color:red;
}

Все работает нормально но когда всречяеться конструкция сложнее в виде ид(#) то получаю вот такую ошбку
File "/home/blast/Old_Projects/css_cleaner/css_cleaner.py", line 23, in <module>
    pattern = re.compile(rx ,re.IGNORECASE)
  File "/usr/lib/python2.7/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.7/re.py", line 244, in _compile
    raise error, v # invalid expression

В файле тест.цсс стили до редактирования, в файле стайлс класи на удаление с новой строки(получаю при помощи Chrome Audits)
# -*- coding: utf-8 -*-
import re
"""
Input file with class to delete
"""
input_to_delete =  open('styles.txt', 'r+')
deleteList = input_to_delete.read().splitlines()
input_to_delete.close()
"""
Input file with start css
"""
input_styles = open('test.css', 'r+')
stylesList = str(input_styles.read())
input_styles.close()
positionDict = {}
for x in deleteList:
    clss = x
    rx = r'\. %s (.+\n)+[}]'% clss
    pattern = re.compile(rx ,re.IGNORECASE)
    try:
        match = re.search(pattern, stylesList)
        print('Нашли клас')
        print('--------------------------')
        print(match.group())
        ret = str(match.group())
        print('Начало и конец строки для удаления ')
        print(match.span()[0])
        print(match.span()[1])
        print('--------------------------')
        stylesList= stylesList[:match.span()[0]] + stylesList[match.span()[1]:]
        print('---------------RESULT-----------')
    except:
        pass
print(stylesList)
newFile = open('newstyleList.css', 'w+')
newFile.write(stylesList)
newFile.close()
  • Вопрос задан
  • 213 просмотров
Решения вопроса 1
@abcd0x00
rx = r'\. %s (.+\n)+[}]'% clss

Там есть re.escape() специально для таких случаев. То есть до подстановки нужно выполнить экранирование.

Немного по коду

Вообще, лучше перейти на третий питон, так как во втором всё хуже сделано. Даже те же регулярные выражения во втором питоне ищут по ASCII, а в третьем - по Unicode. Во втором нужно больше всяких телодвижений делать. Но самое главное, что они потом (эти знания), не используются, так как удалены из питона вообще. То есть учишь всё это зря.
То есть иными словами, зачем тебе знать, что для поиска в Unicode нужно передавать флаг, если этот флаг, начиная с третьего питона, не используется вообще никогда? Время на изучение потратишь - а смысла в этом никакого нет. Лучше потратить время на что-то, что используется.
По самому коду видно, что учить тебе ещё не переучить. И даже не питон, а сами парадигмы, чтобы не писать такие монолиты, привязанные к консоли. Завтра будет задание "написать то же самое, только чтобы выводило не на экран, а в файл, сеть или базу данных", и придётся тебе писать всё заново, потому что ты к консоли привязал всё изначально.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы