3

Python で単純な CSS パーサーに取り組んでいます。今、この文字列からすべての値を抽出したいと思います: "1px solid rgb(255, 255, 255)". 現在、私のパターン(機能していません)は次のとおり"\S+[^rgb]+"です。string"1px solid rgb(255, 255, 255)"で使用すると、次のようになります。

...
>>> re.findall("\S+[^rgb]+", string)
("1px solid", "rgb(255, 255, 255)")

そして、私はそれがしたいです

("1px", "solid", "rgb(255, 255, 255)")

PS また、CSS宣言を解析するためのより良い方法はありますか? 現在、私のパターンは"[\s]?(\S+)[\s]?:[\s]?(.+)[\s]?;"です。解析すると次のようになり"color: red;"ます。

("color", "red")
4

2 に答える 2

2

これを試すことができます:

(\S+)[ ]+(?:(\S+)[ ]+)?(rgb\([^)]+\))

http://regex101.com/r/vA4kH1

編集: 何をしようとしても、CSS 構文は予測できない可能性があるため、これはおそらく正しい処理方法ではありません。Python の CSS パーサーである tinycss を使用すると、より適切な処理を実行できます。

http://pythonhosted.org/tinycss/

最後の編集...

あなたのソリューションによると、findAllを実行しています。これにより、それらが個別に配列に配置されます。スペースを無視して、 rgb() は一度だけ必要です。これは、あなたが持っているものよりもきれいな値のパターンで機能するはずです。また、「。」を使用したくないことに注意してください。rgb() 式の場合。同じ行に rgb() 1px rgb() がある場合、正規表現はデフォルトで貪欲です...可能な限り一致します。これを試してください: r"(rgb([^)]+))|(\S+))"

于 2013-10-25T21:03:21.937 に答える
1

Ok。私はそれを機能させました(願っています)。これが最終的なコードです。


編集

マニュアルを長く退屈に読んだ後、ようやく適切に動作するようになりました。 "rgb\([^)]*\)|\S+"

于 2013-10-25T21:58:05.517 に答える