0

Python で URL 正規表現を探していましたが、スタック オーバーフローを読んだ後、http: //daringfireball.net/2010/07/improved_regex_for_matching_urlsを取得して、Python コードで使用することにしました。

私はこのようなものを入れました:

reg_url =
re.compile(r"""((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.‌​][a-z]{2,4}/)(?:[^\s()<>]+|(([^\s()<>]+|(([^\s()<>]+)))\*))+(?:(([^\s()<>]+|(‌​([^\s()<>]+)))\*)|[^\s`!()[]{};:`".,<>?«»“”‘’]))""",
re.DOTALL)

(パイソン2.7)

その正規表現でコードを実行した後、次のエラーが発生します。

\xe2SyntaxError:ファイルの 60 行目に非 ASCII 文字 ' ' がありますfile.pyが、エンコードが宣言されていません。詳細については、 http://www.python.org/peps/pep-0263.htmlを参照してください。

この問題に対処する最善の方法は何ですか?

4

1 に答える 1

1

Python には、入力エンコーディングに関して (3 ではなく 2 に) 問題があり、ソース コードのデフォルトは ASCII エンコーディングです。の行に沿ってファイルの 1 行目または 2 行目にコメントを追加すると、# encoding: utf-8この問題を修正できます。エラー メッセージにリンクされている PEP は、これをうまく説明しています。

ただし、あなたの正規表現は私には機能しませんが、リンク先のサイトから正規表現をコピーするだけでは機能しますが、これは非常に異なるようです。urlparseを使用する可能性を検討しましたか?

本当に正規表現を使用したい場合は、次の点に注意してください。

regex_a= re.compile(r"(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))")
regex_b = re.compile(r"""((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.‌​][a-z]{2,4}/)(?:[^\s()<>]+|(([^\s()<>]+|(([^\s()<>]+)))\*))+(?:(([^\s()<>]+|(‌​([^\s()<>]+)))\*)|[^\s`!()[]{};:`".,<>?«»“”‘’]))""", re.DOTALL)

regex_a.match("http://www.www.com/thisisatest") # returns a match object
#regex_b.match("http://www.www.com/thisisatest") # edit: actually, this just hangs...

あなたのバージョンでは、エスケープが削除された多数の中括弧、括弧、大括弧があり、奇妙な場所に U+200C および U+200B 文字があるようです。

于 2013-03-29T03:35:31.393 に答える