Спасибо всем большое за ваши предложения и помощь. Я связал все это в следующих двух REGEX Patterns:
Это один разбирает строку селектора CSS (например, DIV # myid.myclass [атр = 1, Фреда = 3]) http://www.rubular.com/r/2L0N5iWPEJ
cssSelector = re.compile(r'^(?P<type>[\*|\w|\-]+)?(?P<id>#[\w|\-]+)?(?P<classes>\.[\w|\-|\.]+)*(?P<data>\[.+\])*$')
>>> cssSelector.match("table#john.test.test2[hello]").groups()
('table', '#john', '.test.test2', '[hello]')
>>> cssSelector.match("table").groups()
('table', None, None, None)
>>> cssSelector.match("table#john").groups()
('table', '#john', None, None)
>>> cssSelector.match("table.test.test2[hello]").groups()
('table', None, '.test.test2', '[hello]')
>>> cssSelector.match("table#john.test.test2").groups()
('table', '#john', '.test.test2', None)
>>> cssSelector.match("*#john.test.test2[hello]").groups()
('*', '#john', '.test.test2', '[hello]')
>>> cssSelector.match("*").groups()
('*', None, None, None)
И это один делает атрибуты (например, [ссылка, ключ ~ = значение]) http://www.rubular.com/r/2L0N5iWPEJ:
attribSelector = re.compile(r'(?P<word>\w+)\s*(?P<operator>[^\w\,]{0,2})\s*(?P<value>\w+)?\s*[\,|\]]')
>>> a = attribSelector.findall("[link, ds9 != test, bsdfsdf]")
>>> for x in a: print x
('link', '', '')
('ds9', '!=', 'test')
('bsdfsdf', '', '')
пару вещей отметить: 1) Это разбирает атрибуты с помощью запятой разграничении (так как я не использую строгой CSS). 2) Для этого требуются шаблоны в формате: тег, идентификатор, классы, атрибуты
Первое регулярное выражение делает маркеры, поэтому пробелы и «>» разделены части селекторной строки.Это потому, что я хотел использовать его для проверки на моем собственном объектном графике :)
Еще раз спасибо!
Если вам нужна вся эта информация, вам лучше использовать что-то вроде [pyparsing] (http://pyparsing.wikispaces.com/). Также похоже, что уже есть несколько библиотек, которые уже делают это: http://cthedot.de/cssutils/ и http://code.google.com/p/css-py/ - хотя неясно, насколько они полны находятся. – BrenBarn
Теоретически, может быть более одного '[key = value]', либо с использованием отдельных списков для ключа и значения, либо с использованием списка атрибутов, который содержит пары ключ-значение. И «тег» может быть более подходящим, чем «тип». –
Плюс, существует больше вариантов атрибута с кавычками и без них для значений атрибутов: '[type]', '[type^= value]', '[type $ = value]' и т. Д., Если это имеет значение, так что может потребоваться также сохранить оператор атрибута. –