web-dev-qa-db-ja.com

正規表現を使用してpython内の大文字の繰り返し文字を1つの小文字に置き換える

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

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

「\ 1」を小文字にする方法を教えてください。これを行うために正規表現を使用すべきではありませんか?

29
ajt

関数を渡す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)

[〜#〜]編集[〜#〜]
そして、はい、あなたは([A-Z])\1 の代わりに ([A-Z]){2}一致しないためAZ。 (@bobinceの answer を参照してください。)

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

与える:

'start t end'
43
jensgram

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

>>> def replacement(match):
...     return match.group(1).lower()
... 
>>> re.sub(r'([A-Z])\1', replacement, 'start TT end')
'start t end'
6
bobince

あなたはそれを正規表現で行うことができます-- the docs 言うような置換として関数を渡すだけです。問題はあなたのパターンです。

そのまま、パターンはany2つの大文字の実行に一致します。実際のパターンはあなたにお任せしますが、AA|BB|CC|で始まります。

置換を識別する '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'
0
bgporter

これを試して:

_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,}'を使用します。

0
khachik

警告!この投稿には要求された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
"""
0