1

この例に戻ると、

Pythonで正規表現を使用して異なるものを印刷するために類似の文字を処理するのに問題がある

私が行った正規表現の置換を元に戻し、元のテキストを出力するにはどうすればよいでしょうか?

つまり、私が持っている場合

text = "This is my first regex python example yahooa yahoouuee bbbiirdd"

元のテキストとして、出力は次のようになります。

re.sub text = "tookhookisook isook mookyook fookirooksooktook pookyooktookhookonook..."

そして、その出力を元のテキストに変換したいと思います。

それ、どうやったら出来るの?

4

3 に答える 3

4

Python文字列は不変です。元の文字列を変更しておらず、新しい文字列を作成しただけです。オリジナルへの参照を保持するだけです。

編集
不変とは、作成後に実際の値が凍結されることを意味します。

>>> s = "abc"
>>> s[0]
'a'
>>> s[1] = 'd'

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    s[1] = 'd'
TypeError: 'str' object does not support item assignment
>>> 

上記の例では、変数にs別のオブジェクトを参照させることができますが、それに割り当てた文字列は定数です。したがって、を実行するs.replace()と、結果は新しい文字列になり、元の文字列は変更されません。

>>> s.replace ('a', 'd')
'dbc'
>>> s
'abc'
>>> 
于 2013-03-03T17:39:31.973 に答える
1

これはうまくいくようです:

import re 

tu = ('This is my first regex python example '
      'yahooa yahoouuee bbbiirdd',

      'bbbiirdd',

      'fookirooksooktook',

      'crrsciencezxxxxxscienceokjjsciencq')

reg   = re.compile(r'([bcdfghj-np-tv-z])(\1?)')
dereg = re.compile('science([^aeiou])|([^aeiou])ook')

def Frepl(ma):
    g1,g2 = ma.groups()
    if g2:  return 'science' + g2
    else:   return g1 + 'ook'

def Fderepl(ma):
    g = ma.group(2)
    if g:  return g
    else:  return 2*ma.group(1)

for strt in tu:
    resu =   reg.sub(Frepl  , strt)
    bakk = dereg.sub(Fderepl, resu)
    print ('----------------------------------\n'
           'strt = %s\n'    'resu == %s\n'
           'bakk == %s\n'   'bakk == start : %s'
           % (strt, resu, bakk, bakk==strt))

編集

まず、上記のコードを更新しましたre.I。フラグを削除しました。「dD」のような部分を繰り返し文字としてキャプチャしていました。そのため、「scienceD」に変換され、その後「DD」に戻りました

次に、コードを辞書で拡張しました。
文字を文字 + 'ook' で置き換える代わりに、文字に従って置き換えます。
たとえば、'b' を 'BAR' に、'c' を 'CORE' に置き換えることを選択しました。結果を見やすくするために、辞書の値を大文字にしました。それは実際には他の何かかもしれません。
プログラムがケースを処理します。'T','Y','X' だけを辞書に載せました。これはエッセイ用です。

import re 

d = {'b':'BAR','c':'CORE','d':'DEAD','f':'FAN',
     'g':'GO','h':'HHH','j':'JIU','k':'KOAN',
     'l':'LOW','m':'MY','n':'NERD','p':'PI',
     'q':'QIM','r':'ROAR','s':'SING','t':'TIP',
     'v':'VIEW','w':'WAVE','x':'XOR',
     'y':'YEAR','z':'ZOO',
     'T':'tears','Y':'yearling','X':'xylophone'}

ded = dict((v,k) for k,v in d.iteritems())
print ded

tu = ('This is my first regex python example '
       'Yahooa yahoouuee bbbiirdd',

      'bbbiirdd',

      'fookirooksooktook',

      'crrsciencezxxxxxXscienceokjjsciencq')

reg   = re.compile(r'([bcdfghj-np-tv-zBCDFGHJ-NP-TV-Z])(\1?)')

othergr = '|'.join(ded.keys())
dereg = re.compile('science([^aeiouAEIOU])|(%s)' % othergr)

def Frepl(ma, d=d):
    g1,g2 = ma.groups()
    if g2:  return 'science' + g2
    else:   return d[g1]

def Fderepl(ma,ded=ded):
    g = ma.group(2)
    if g:  return ded[g]
    else:  return 2*ma.group(1)

for strt in tu:
    resu =   reg.sub(Frepl  , strt)
    bakk = dereg.sub(Fderepl, resu)
    print ('----------------------------------\n'
           'strt = %s\n'    'resu == %s\n'
           'bakk == %s\n'   'bakk == start : %s'
           % (strt, resu, bakk, bakk==strt))

結果

----------------------------------
strt = This is my first regex python example Yahooa yahoouuee bbbiirdd
resu == tearsHHHiSING iSING MYYEAR FANiROARSINGTIP ROAReGOeXOR PIYEARTIPHHHoNERD eXORaMYPILOWe yearlingaHHHooa YEARaHHHoouuee sciencebBARiiROARscienced
bakk == This is my first regex python example Yahooa yahoouuee bbbiirdd
bakk == start : True
----------------------------------
strt = bbbiirdd
resu == sciencebBARiiROARscienced
bakk == bbbiirdd
bakk == start : True
----------------------------------
strt = fookirooksooktook
resu == FANooKOANiROARooKOANSINGooKOANTIPooKOAN
bakk == fookirooksooktook
bakk == start : True
----------------------------------
strt = crrsciencezxxxxxXscienceokjjsciencq
resu == COREsciencerSINGCOREieNERDCOREeZOOsciencexsciencexXORxylophoneSINGCOREieNERDCOREeoKOANsciencejSINGCOREieNERDCOREQIM
bakk == crrsciencezxxxxxXscienceokjjsciencq
bakk == start : True
于 2013-03-03T20:34:41.847 に答える
0

Python またはその他の正規表現の実装では、正規表現の置換を逆方向に「変換」することはできません。

これは単純に、置換が新しい文字列を返す一方通行であり、魔法の逆関数がないためです。

これは string.replace() を使用した図です:

original_string = 'abc'
newstring = original_string.replace('a','b')
'bbc'

newstring を 'abc' に変換することは、'a' を 'b' に置き換えるだけではありません。特定の正規表現から「逆」正規表現を作成することはできません。この例で「b」を「a」に置き換えると、文字列は bbc ではなく「aac」になります。

正規表現関数は、string.replace と同じように機能します。新しい文字列を返します。すべての正規表現置換の正確な状態を知っているオブジェクトを返すわけではありません。

やりたいことを何でもするための 2 つのオプションがあります。

1- 文字列を表し、(無限の?) 数の正規表現操作を追跡するカスタム クラスを作成し、各状態間の差分を作成できるようにします。

2- 他の人がしていることと、ここにいる多くの人が提案していることを実行します。元の文字列 (またはそのコピー) を横に隠しておくだけです。

(これは @StoryTeller からの回答を簡素化するための努力です)

于 2013-03-03T20:47:57.230 に答える