2

テキスト ファイル内の URI/L からパラメータとキーワードの値を解析したいと考えています。値のないパラメータも含める必要があります。Python は問題ありませんが、Perl やワンライナーなどの他のツールを使用することも提案できます。

ソースの例:

www.domain.com/folder/page.php?date=2012-11-20
www2.domain.edu/folder/folder/page.php?l=user&x=0&id=1&page=http%3A//domain.com/page.html&unique=123456&refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname&text=
www.domain.edu/some/folder/image.php?l=adm&y=5&id=2&page=http%3A//support.domain.com/downloads/index.asp&unique=12345
blog.news.org/news/calendar.php?view=month&date=2011-12-10

出力例:

date=2012-11-20
l=user
x=0
page=http%3A//domain.com/page.html&unique=123456
refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname
test=
l=adm
y=5
id=2
page=http%3A//support.domain.com/downloads/index.asp
unique=12345
view=month
date=2011-12-10
4

3 に答える 3

-1

次のような正規表現を使用します (最初のコード、次に説明)。

pairs = re.findall(r'(\w+)=(.*?)(?:\n|&)', s, re.S)
for k, v in pairs:
    print('{0} = {1}'.format(k, v))

最初の行は、アクションが発生する場所です。正規表現は、単語の後に等号が続き、その後に a&または改行文字で終わる文字列が出現するすべての箇所を検索します。戻り値pairsはタプル リストで、各タプルには単語 (キーワード) と値が含まれます。=記号をキャプチャせず、代わりにループで印刷します。

正規表現の説明:

\w+1 つ以上の単語文字を意味します。それを囲む括弧は、それをキャプチャして結果としてその値を返すことを意味します。

=- 単語の後に必要な等号

.*?- 貪欲でない方法での 0 個以上の文字。つまり、新しい行が表示されるまで、または&で指定された記号まで\n|&。この(?:..パターンは、\nor&をキャプチャしてはならないことを意味します。

正規表現で 2 つのもの (キーワードと=記号の後のすべて) をキャプチャするため、2 タプルのリストが返されます。

re.S正規表現エンジンに、すべて一致する正規表現コードを許可するように指示します.。つまり、検索に改行文字も含めます。つまり、複数行にわたる検索範囲を許可します (これはデフォルトの動作ではありません)。

于 2013-09-10T18:40:08.897 に答える