Regex в python для получения комментариев в стиле javadoc в CSS - PullRequest
1 голос
/ 23 сентября 2010

Я пишу скрипт на python, чтобы пройти через каталог CSS-файлов и сохранить содержимое любого из них, который содержит специально отформатированный комментарий в стиле javadoc.

Комментарий / CSS выглядит так:

/**thirdpartycss

* @description Used for fixing stuff

*/
.class_one {
    margin: 10px;
}
#id_two {
    padding: 2px;
}

Регулярное выражение для извлечения всего содержимого файла выглядит следующим образом:

pattern = "/\*\*thirdpartycss(.*?)}$"
matches = re.findall(pattern, css, flags=re.MULTILINE | re.DOTALL)

Это дает мне содержимое файла.Сейчас я хочу написать регулярное выражение, чтобы получить каждое определение CSS внутри класса.Вот что я попробовал:

rule_pattern = "(.*){(.*)}?"
rules = re.findall(rule_pattern, matches[0], flags=re.MULTILINE | re.DOTALL)

Я в основном пытаюсь найти любой текст, затем открывающий {, любой текст, затем закрывающий} - я хочу список всех классов CSS, по сути, но это просто возвращает всю строку в одном фрагменте.

Кто-нибудь может указать мне правильное направление?

Спасибо.Matt

Ответы [ 2 ]

2 голосов
/ 23 сентября 2010

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

{(.*?)}

разница в вопросительном знаке после звездочки, что делает его нежадным.

Это по-прежнему не сработает, если вам нужно правильно сопоставить «вложенные» скобки - но тогда ничто в мире RE не будет: среди обычных языков много известных ограничений (обычные языки - это те, что что регулярные выражения могут совпадать) в том, что «правильное вложение» любого вида открытых / закрытых скобок невозможно (некоторым невероятно расширенным так называемым RE удается, но не Python, и любой, имеющий фон CS, сочтет эти выражения регулярными "в любом случае оскорбительно ;-). Если вам нужен более общий анализ, чем могут себе позволить RE, pyparsing или другие полноценные парсеры Python - правильный путь.

1 голос
/ 23 сентября 2010

@ Алекс прав (неужели нет? Но я отвлекся).Вам лучше использовать собственный анализатор, если вам нужен более специфический синтаксический анализ, чем те, которые могут предложить регулярные выражения.К счастью, вам не нужно заново изобретать колесо CSS-анализа.Для этого уже существует решение.

Некоторое время назад я столкнулся с аналогичным требованием.Модуль cssutils пригодился в то время.Я только что обновил свой cssutils fu, чтобы подготовить для вас этот фрагмент кода:

In [16]: import cssutils

In [17]: s = """/**thirdpartycss
* @description Used for fixing stuff
*/
.class_one {
    margin: 10px;
}
#id_two {
    padding: 2px;
}"""

In [26]: sheet = cssutils.parseString(s)

In [27]: sheet.cssRules
Out[27]: 
[cssutils.css.CSSComment(cssText=u'/**thirdpartycss\n* @description Used for fixing stuff\n*/'),
 cssutils.css.CSSStyleRule(selectorText=u'.class_one', style=u'margin: 10px'),
 cssutils.css.CSSStyleRule(selectorText=u'#id_two', style=u'padding: 2px')]

In [28]: sheet.cssRules[0].cssText
Out[28]: u'/**thirdpartycss\n* @description Used for fixing stuff\n*/'

In [29]: print sheet.cssRules[0].cssText
-------> print(sheet.cssRules[0].cssText)
/**thirdpartycss
* @description Used for fixing stuff
*/

Вы можете проанализировать CSS, а затем перебрать cssRules объекта sheet, чтобы найти все CSSComment экземпляры.

...