2012-04-27 12 views
2

この正規表現をPython reモジュールに翻訳するのを手伝ってもらえますか?私はこれを理解してきたようにsed regex to Python re

sed -e "s/^[^ ]* \([^ ]*\) \([0-9]*\) \([0-9:]*\) \([0-9]*\) /\1 \2 \4 \3 /"

は、別のテキストを置き換えます。 reモジュールを使って、どうすればこのようなものを作成できますか?ありがとう!

Fri Mar 21 07:16:51 2008 -0600Mar 21 2008 07:16:51 -0600に変換されます。

source = 'Fri Mar 21 07:16:51 2008 -0600' 
pattern = re.compile('^[^ ]* \([^ ]*\) \([0-9]*\) \([0-9:]*\) \([0-9]*\) ') 
result = re.sub('\\1 \\2 \\4 \\3 ', source) 
+0

@nightcracker:私は '' re.sub''を使用しなければならないことを理解し、私は想像することはできません'' \ 1 \ 2 \ 4 \ 3'を意味します。 – ghostmansd

+0

いいえ、何を__tried__していますか? – orlp

+0

'\ 1 \ 2 \ 4 \ 3'は' \\ 1 \\ 2 \\ 4 \\ 3'を使ってマッチさせることができ、それ以外に正規表現*をPythonのreモジュールに変換する必要があります。 – covertCoder

答えて

2

のように、あまりにもあなたのパターンに括弧にバックスラッシュをドロップ:

pattern = re.compile('^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ') 

あなたはそれを持っていた道を、あなたはグループとして認識する必要が括弧をエスケープしているので、実際に4

+0

うん、それはうまくいきます!しかし、なぜ?私は '' sed''でのみこれらのシンボルをスクリーニングする必要がありますか? – ghostmansd

+0

なぜ 'sed'で動作するのか分かりませんが、Pythonでは正規表現の特殊文字として使用するのではなく、マッチさせたいときにのみ特殊文字をエスケープします:P。これはおそらくあなたが得ることができる最もクリーンな答えです。それが私のものを削除した理由です。 – covertCoder

+0

sedコマンドのバックスラッシュは、コマンドプロセッサ(bash/sh/whatever)のためにバックスラッシュをエスケープしています。 –

1

\これを試してみてください... \ 1に対応した4つのグループをキャプチャし、ワンライナーのバージョン:

import re 
re.sub(r'^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ', '\g<1> \g<2> \g<3> \g<4>', source) 

またはこの、コンパイルされたパターン使用して - 同じ正規表現を再利用する場合は、より効率的に:

import re 
pattern = re.compile(r'^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ') 
pattern.sub('\g<1> \g<2> \g<3> \g<4>', source) 
+0

それは動作しません。 – ghostmansd

+1

これを編集した後も動作します。 – ghostmansd

+0

@hostmansdもう一度やり直してください。自分の答えを更新しました –