2

この Perl 正規表現があり、それを Python に変換したいと考えています。

私が望む正規表現は、テキストを検索して大文字に変換する検索と置換です。また、最初に発生した結果でなければなりません。Perl正規表現:

open FILE, "C:/thefile.txt";
while (<FILE>){
    # Converts "foo yadayada bar yadayada"
    #       to "FOO  bar yadayada"
    s/(^.*?)(yadayada)/\U$1/;
    print;
}

私が持っている Python 正規表現が正しく機能していません:

import re
lines = open('C:\thefile.txt','r').readlines()
for line in lines:
    line = re.sub(r"(yadayada)","\U\g<1>", line, 1)
    print line

Python は大文字を\U\g<1>サポートしていないため、これが機能していないことに気付きました。\U

4

2 に答える 2

3

re.sub各一致オブジェクトを処理して文字列を返す関数を取ることができます。したがって、次のようにすることができます。

In [4]: def uppergrp(match):
   ...:     return match.group(1).upper()
   ...: 

In [5]: re.sub("(yada)", uppergrp, "abcyadadef", count=1)
Out[5]: 'abcYADAdef'

Python で正規表現を使用するのはあまり便利ではありませんが、Python プログラマーは Perl コーダーほど正規表現を使用することに熱心ではない傾向があります。

于 2012-05-17T16:22:56.377 に答える
2

sub の 2 番目の引数は関数にすることもできます。つまり、Python の正規表現言語が目的を達成できない場合 (または、少なくともそれが非常に困難になる場合) は、代わりに使用する独自の関数を定義することができます。

例えば。

re.sub(pattern, lambda x: x.group(1).upper(), string)

編集: 関数にMatchObjectが渡される

于 2012-05-17T16:23:00.070 に答える