python
  • regex
  • 2011-02-01 9 views 2 likes 
    2

    正規表現を使用してファイル内の文字列を置き換えたいと考えています。しかし、私の機能は一致を見つけることができません。だから私は起こっていることを複製するためのテストを嘲笑した。この正規表現がこの文字列で一致しないのはなぜですか?

    私は次のように置き換えたい文字列を定義している:私は何か他のもので、 "TYPE = PUZZLE & PREFIX = EXPRESS &" の部分を置き換えたい

    string = 'buf = O_strdup("ONE=001&TYPE=PUZZLE&PREFIX=EXPRESS&");'

    を。 NB。文字列は必ず元のファイルに "PUZZLE"と "PREFIX"を正確に含むとは限りませんが、その形式になります)。

    最初に、私は正しいマッチを得たことをテストしました。

    obj = re.search(r'TYPE=([\^&]*)\&PREFIX=([\^&]*)\&', string) 
    if obj: 
        print obj.group() 
    else: 
        print "No match!!" 
    

    ([\^&]*)は、アンパサンドではない任意の数の文字と一致すると考えます。 しかし、私はいつも "No match !!"を得る。しかし

    obj = re.search(r'TYPE=([\^&]*)', string)

    は私を返す "TYPE ="

    しないのはなぜ私の最初の1つの作業?

    +0

    なぜ前にバックスラッシュが入りますか? – abesto

    +1

    非常に最初の変更は[^&] –

    答えて

    5

    ^サインが\次の部分でエスケープされているので:、^ &:([\^&]*)は、これらの文字列にマッチします。

    ([^&]*)と交換してください。私の正規表現テスターで

    +0

    * "これらの文字の任意のシーケンスに一致します。\、^、&。" *バックスラッシュではなく、 '^'と '&'だけです。 –

    +0

    あなたは正しいです、すでにそれを修正しました。 –

    1

    、これが作業を行います。'TYPE=(.*)\&PREFIX=(.*)\&'

    0

    ?P<some_name>は名前のキャプチャグループで、キャプチャグループにアクセスすることが少し簡単になり、obj.group("type") -->> 'PUZZLE'

    obj = re.search(r'TYPE=(?P<type>[^&]*?)&PREFIX=(?P<prefix>[^&]*?)&', string) 
    

    代わりにこれを試してみてください

    0

    正規表現の代わりにurlparse.parse_qsl()urllib.urlencode()という関数を使用する方がよい場合があります。コードはエラーが起こりにくいでしょう:

    from urlparse import parse_qsl 
    from urllib import urlencode 
    s = "ONE=001&TYPE=PUZZLE&PREFIX=EXPRESS&" 
    a = parse_qsl(s) 
    d = dict(TYPE="a", PREFIX="b") 
    print urlencode(list((key, d.get(key, val)) for key, val in a)) 
    # ONE=001&TYPE=a&PREFIX=b 
    
    関連する問題