35

文字列内で 2 回繰り返される大文字のインスタンスを、小文字のその文字の 1 つのインスタンスに置き換えようとしています。次の正規表現を使用しており、繰り返される大文字に一致させることができますが、置き換えられる文字を小文字にする方法がわかりません。

import re
s = 'start TT end'
re.sub(r'([A-Z]){2}', r"\1", s)
>>> 'start T end'

「\1」を小文字にするにはどうすればよいですか? これを行うために正規表現を使用すべきではありませんか?

4

7 に答える 7

56

関数を引数として渡しreplます。がこのMatchObject関数に渡され、.group(1)括弧で囲まれた最初のサブグループが得られます。

import re
s = 'start TT end'
callback = lambda pat: pat.group(1).lower()
re.sub(r'([A-Z]){2}', callback, s)

EDIT
そして、はい、一致しないために([A-Z])\1代わりに使用する必要があります。(@bobince の回答を参照してください。)([A-Z]){2}AZ

import re
s = 'start TT end'
re.sub(r'([A-Z])\1', lambda pat: pat.group(1).lower(), s) # Inline

与えます:

'start t end'
于 2010-11-10T14:27:49.037 に答える
7

置換文字列で大文字と小文字を変更することはできません。代わりの関数が必要になります:

>>> def replacement(match):
...     return match.group(1).lower()
... 
>>> re.sub(r'([A-Z])\1', replacement, 'start TT end')
'start t end'
于 2010-11-10T14:29:21.210 に答える
1

ドキュメントが言うように、置換として関数を渡すだけで、正規表現でそれを行うことができます。問題はあなたのパターンです。

そのままでは、パターンは任意の 2 つの大文字の連続に一致します。実際のパターンはお任せしますが、 から始まりますAA|BB|CC|

于 2010-11-10T14:27:49.653 に答える
0

これを試して:

def tol(m):
   return m.group(0)[0].lower()

s = 'start TTT AAA end'
re.sub(r'([A-Z]){2,}', tol, s)

これは単一の大文字を置き換えないことに注意してください。したい場合は、 を使用してくださいr'([A-Z]){1,}'

于 2010-11-10T14:34:03.337 に答える
0

置換を識別する「repl」パラメーターは、文字列 (ここにあるように) または関数のいずれかです。これはあなたが望むことをします:

import re

def toLowercase(matchobj):
   return matchobj.group(1).lower()

s = 'start TT end'
re.sub(r'([A-Z]){2}', toLowercase, s)
>>> 'start t end'
于 2010-11-10T14:30:03.157 に答える
0

警告!この投稿には、リクエストされた re はありません。自己責任で進めてください!

まれなケースがどの程度可能かはわかりませんが、これは通常の Python が素朴なコーディングを行う方法です。

import string
s = 'start TT end AAA BBBBBBB'
for c in string.uppercase:
    s = s.replace(c+c,c.lower())
print s
""" Output:
start t end aA bbbB
"""
于 2010-11-10T15:55:27.150 に答える