RE:HTMLのhrefパーサ
やさしいt-fridgeが以前に書いたhrefパーサについての返事をくれたので,コードを解析してみます.
以前に僕の書いたコードは
# coding: utf-8 import re def hrefParser (inStr): buff = [] ro1 = re.compile ("<a.+?href\s*=\s*\"(.*?)\".*?>", re.I) ro2 = re.compile ("<a.+?href\s*=\s*\'(.*?)\'.*?>", re.I) rs1 = ro1.search (inStr) while (rs1): buff.append (inStr[rs1.group ().start ():rs1.group ()end()]) inStr = inStr[:rs1.group ().start ()] + inStr[rs1.group ().end():]) rs1 = ro1.search (inStr) rs2 = ro2.search (inStr) while (rs2): buff.append (inStr[rs2.group ().start ():rs2.group ()end()]) inStr = inStr[:rs2.group ().start ()] + inStr[rs2.group ().end():]) rs2 = ro2.search (inStr) return buff
はは,醜い.
で,t-fridgeのコードは
# coding: utf-8 import re reg = re.compile( r'<a\s+.*href\s*=\s*[\s|\'|"]{0,1}(http://[a-zA-Z\d?*!$&%#@~_=\-/.,;:()]+)[\s|\'|"]{0,1}.*>.*</a>', re.IGNORECASE ) def searchURL(bodystring): return = re.findall(reg,bodystring)
おお,短い.
ざっと見てポイントは正規表現とfindallにあるようですね.
正規表現
まず,僕の無知.パイプ"|"を使うとキャラクタークラスの中に選択肢を押し込む事が出来る点.
無知でした.
次に,ぼくの想定していたタグの属性の書き方は
- <a href="http://example.com">
- <a href="">http://example.com">
なんだけど,t-fridgeの話によると
- <a href = http://example.com>
のような表記も誤りながら認められているらしい.
そのため,[\s|\'|"]{0,1}というパターンになるらしい.
この表現で上記の3つ全てのパターンに対応できる.
findall
で紹介されているように文字列の中から複数のマッチするものをヒットさせることが可能なのがfindall.
無知でした.
まとめ
がんばる.
正規表現は要勉強.たくさんパターンを書こう.
Pythonは本当の始めからやり直したい.
適当にやってるとためだ.
というわけで明日,某所でPython本でもかってこようかな.
- 作者: Mark Lutz,夏目大
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/02/26
- メディア: 大型本
- 購入: 12人 クリック: 423回
- この商品を含むブログ (133件) を見る
コードのネストを無視して動的にスコープを覆い隠す方法について
var a = 0; var fun = function (arg) { if (arg) { eval ("var a = 1;"); // exp.1 } print ("a : " + a); }; fun (true); // a : 1 fun (false): // a : 0
という方法を紹介しましたけど,実はこういう風にやる方が普通っぽい.わからないけど.
var a = 3; var fun = function (arg) { var a = 4; if (arg) { with (window) { alert (a); } } else { alert (a); } }; alert (fun (true));// 結果 : 3 alert (fun (false));// 結果 : 4
この方が素直.
前回も書いたんだけど,これができても何の役に立つかはよくわからない.
しかも,よくよく考えると,コーディングスタイルとしても,こういう書き方は如何かと思う.
javascriptはレキシカルスコープを持つ言語なので,スコープはあくまでもネストによって解決されるべきではないか?
withのようにスコープのネストの一部をまるまるコンテキストに張り付けるのは
危険だ.
とくに,with (window)などと書くのは実効速度的にも問題があると思う.
コーディングスタイルによって危険なコードは避けることができる.
無駄な危険は極力避けるべきだ.