2017-12-28 20 views
1

私は自分自身でこれを理解しようとしていましたが、今は不満を募らせてStackXersに手を差し伸べたいと思っていました。私は、Boring Stuff udemyコースの自動化を使用して、正規表現を学習する初心者のPython開発者です。私のコードがあるrestは文字列全体に置換されません

original_string = '''12 Drummers Drumming 11 Pipers Piping 10 Lords a 
Leaping 9 Ladies Dancing 8 Maids a Milking 7 Swans a Swimming 6 Geese a 
Laying 5 Golden Rings 4 Calling Birds 3 French Hens 2 Turtle Doves and a 
Partridge in a Pear Tree''' 

ある

target_string = '12 drummers drumming, 11 pipers piping, 10 lords a leaping, 
9 ladies dancing, 8 maids a milking, 7 swans a swimming, 6 geese a laying, 5 
golden rings, 4 calling birds, 3 french hens, 2 turtle doves, and a 
partridge in a pear tree' 

元の文字列(メトロリリックからコピー):私の問題については

、 私は使用正規表現しようとしていますがこのターゲット文字列を作成します

import re 
strings = '''12 Drummers Drumming 11 Pipers Piping 10 Lords a Leaping 9 
Ladies Dancing 8 Maids a Milking 7 Swans a Swimming 6 Geese a Laying 5 
Golden Rings 4 Calling Birds 3 French Hens 2 Turtle Doves and a Partridge in 
a Pear Tree''' 
lyrics = strings.split() 
xmasRegex = re.compile(r'\d+\s\D+\s([a-zA-Z]+)') 
re.sub(r'\1,',strings) 

これは、最後にコンマをつけた韻文の単語( "Doves"を含む)を置き換えて文字列に戻そうとしています(意図しない "Tree"と "Doves"このメソッドを使用して、ターゲット文字列に表示されます。 forループといくつかの微妙な変更でこれを行うことは可能ですが、私はそれを正規表現の方法でやりたかったのです。

サブメソッドや正規表現オブジェクトで何が問題になっていますか?

+0

文字列を小文字にしようとしているようです。何か不足していますか? – thefourtheye

+0

次の正規表現は問題を解決するのに役立ちますか? – Allan

答えて

1

あなたは2回のパスでそれを行うことができます。

1)何かスペースが先行する数字r'((\s|^)\d+)'を検出し、最初に一致したグループに後方参照を使用してhttps://regex101.com/r/7yxSaj/1/上でテスト',\1'

それを置き換えるために 使用この正規表現

2)単語の最初の大文字を検出し、下部ケースに変換する 使用この正規表現:r'\b([A-Z])'と置換文字列:'\L\1' これは、1回のパスでandの前にカンマを含む全対象の文字列を再現https://regex101.com/r/dNuYhG/1/

+1

ありがとう、これは2つの式のようにはっきりしていませんが、これは非常に役に立ち、私が言ったような正規表現だけを使用しています。 \ b文字クラスに精通していなかった – Jonesn11

+1

Pythonの 're'は' \ L'や '\ U'のような大文字と小文字を変更する演算子をサポートしていません。 –

2

上でテスト。

In [34]: target_string 
Out[34]: '12 drummers drumming, 11 pipers piping, 10 lords a leaping, 9 ladies dancing, 8 maids a milking, 7 swans a swimming, 6 geese a laying, 5 golden rings, 4 calling birds, 3 french hens, 2 turtle doves, and a partridge in a pear tree' 

In [35]: original_strings 
Out[35]: '12 Drummers Drumming 11 Pipers Piping 10 Lords a Leaping 9 Ladies Dancing 8 Maids a Milking 7 Swans a Swimming 6 Geese a Laying 5 Golden Rings 4 Calling Birds 3 French Hens 2 Turtle Doves and a Partridge in a Pear Tree' 

In [36]: replaced_strings = re.sub('(\s\d+|\sand)',r',\1',original_strings).lower() 

In [37]: target_string == replaced_strings 
Out[37]: True 
+0

興味深い私はサブアドレスがビデオを考えて3つの引数を受け入れたのか分からなかったが、それは私のためにそれがはるかに良い、ありがとう! – Jonesn11

関連する問題