1

私は最近、正規表現の力を学び、利用していますos.walk()。次のように、から返されたファイルのタプルリストがあります。

files = ('s8_00.tif', 's9_00.tif', 's10_000.tif', 's11_00.tif')

私はそれを次のように見せようとしています:

files = ('s8_##.tif', 's9_##.tif', 's10_###.tif', 's11_##.tif')

これを使ってみました。

pad2 = re.compile(r'_00?')

for root, dirs, files in seqDirs:
  pad = files[0]  
  p = pad2.sub("#", pad)
  print p

これは以下を返します:

p = ('s8#.tif', 's9#.tif', 's10#0.tif', 's11#.tif')

そこで、次のように表現を変更しました。

pad2 = re.compile('(_)0+')

私に与える:

p = ('s8#.tif', 's9#.tif', 's10#.tif', 's11#.tif')

私のp = pad2.sub機能に問題がありますか?または、コンパイルされた式内に問題がありますか? それとも、それ"_"を台無しにしているのは表現の存在ですか?

テストするためだけに関数内に式を渡そうとpad2.subしましたが、もちろんうまくいきませんでした。ここで何かが少し欠けていることを知っており、少し立ち往生しています。

ロジックの説明とともに、ありとあらゆる助けをいただければ幸いです。

4

3 に答える 3

5

文字列ではなく、置換に関数を使用します。

def replacer(data):
    return re.sub(r'(?<=_)(0+)', lambda m: m.group(0).replace('0', '#'), data)

files = ('s8_000.tif', 's9_00.tif', 's10_000.tif', 's11_00.tif')
map(replacer, files)
print(files)

?<=肯定的な後読みアサーションです。正規表現の構文のドキュメントで説明を見つけることができます。

0+後続のすべてのゼロをキャプチャします

ラムダ関数は、every0#.

于 2012-09-24T21:00:23.610 に答える
2

任意の数字が存在する可能性がある場所で実行したい場合は、正規表現を次のようにします

pattern = re.compile("_(\d+)")

で置換を行います

pattern.sub("_"+len("\g<1>")*"#", filename)

どの正規表現でも、最初の値が "\g<1>"、次のかっこセットが "\g<2>" などの括弧でキャッチされたものにアクセスできます。"\d+" は、式内の任意の数字を取得します。非常に具体的にゼロを探したい場合は、「_(0+)」に置き換えることができます

于 2012-09-24T20:41:57.757 に答える
0

一致するものを見つけて、それらの長さを計算してから、その数の#s に置き換えたほうがよいでしょう。

于 2012-09-24T20:54:57.970 に答える