2

この CSS セレクター (および同様の形式の他のセレクター) を解析したい: div.class1#myid.class2[key=value]

「.class1」と「.class2」に一致させますが、使用する正規表現がわかりません..

例: http://www.rubular.com/r/3dxpzyJLeK

理想的な世界では、次のものも抽出したいと思います。

  • タイプ (つまり div)
  • クラス (つまり、クラスのリスト)
  • id (つまり、myid)
  • キー (すなわちキー)
  • 演算子 (=)
  • 値 (つまり値)

だけど基礎が身につかない!

どんな助けでも大歓迎です:)

ありがとう!

4

3 に答える 3

2

あなたの提案と助けに感謝します。すべてを次の 2 つの正規表現パターンにまとめました。

これは CSS セレクター文字列を解析します (例: div#myid.myclass[attr=1,fred=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)

そして、これは属性を行います (例: [link,key~=value]) 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) これには、次の形式のパターンが必要です: タグ、ID、クラス、属性

最初の正規表現はトークンを処理するため、空白と '>' でセレクター文字列の一部を区切ります。これは、自分のオブジェクト グラフと照合するために使用したかったためです :)

再度、感謝します!

于 2012-06-26T11:17:41.683 に答える
1

みたいなのが必要だと思います。

(?P<tag>[a-zA-Z]+)?(\.(?P<class>[a-zA-Z0-9_-]+)?)?(#(?P<id>[a-zA-Z0-9_-])?)?\W*\{((?P<name>[a-zA-Z0-9-_]+?)=(?P<value>[a-zA-Z0-9-_]+?))*\}

動作しない場合は申し訳ありませんが、テストしていません

于 2012-06-23T20:26:36.570 に答える
1

単一の正規表現でこれをやろうとしないでください。正規表現は、読み取りとデバッグが難しいことで知られているため、このタスクの最初の 80% を完了してから戻ってバグを修正しようとすると、コードは悪夢のようになります。

代わりに、やりたいことを実行できるようにする関数またはクラスを作成してみてください。次に、特定のタスクごとに比較的単純な正規表現を使用し、実装でより直感的な構文を使用できます。

class css_parser:

  def __init__(self):
    self.class_regexp = re.compile('\.[\w\-]*') # This is insufficient, but it's a start...

  def get_class(self, str):
    m = self.class_regexp.match(str)
    return m.group(0)

W3C CSS 仕様、特にセクション 4を参照してください。

于 2012-06-23T20:29:02.957 に答える