Z
Z
zelsky2016-04-01 12:26:44
Python
zelsky, 2016-04-01 12:26:44

Error in module re raise error, v # invalid expression?

I came up with a task. Remove all styles that I do not use from the css file.
When working with simple files like

.class {
color:red;
}

Everything works fine, but when the construction is more complicated in the form of id (#), I get this error
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

In the test.css file, styles before editing, in the styles file, put it on a new line (I get it using 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()

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
abcd0x00, 2016-04-02
@zelsky

rx = r'\. %s (.+\n)+[}]'% clss

There's re.escape() specifically for such cases. That is, before substitution, you need to perform screening.
Вообще, лучше перейти на третий питон, так как во втором всё хуже сделано. Даже те же регулярные выражения во втором питоне ищут по ASCII, а в третьем - по Unicode. Во втором нужно больше всяких телодвижений делать. Но самое главное, что они потом (эти знания), не используются, так как удалены из питона вообще. То есть учишь всё это зря.
То есть иными словами, зачем тебе знать, что для поиска в Unicode нужно передавать флаг, если этот флаг, начиная с третьего питона, не используется вообще никогда? Время на изучение потратишь - а смысла в этом никакого нет. Лучше потратить время на что-то, что используется.
По самому коду видно, что учить тебе ещё не переучить. И даже не питон, а сами парадигмы, чтобы не писать такие монолиты, привязанные к консоли. Завтра будет задание "написать то же самое, только чтобы выводило не на экран, а в файл, сеть или базу данных", и придётся тебе писать всё заново, потому что ты к консоли привязал всё изначально.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question