2016-09-22 6 views
0

これがあり、私は文字列の最後の数字の後にすべての文字を削除する方法を学びましたthis question.は、文字列の最後の番号の後に(特定の文字を除く)のすべてを削除する方法

のフォローアップです。

re.sub(r'\D+$', '', w) 

は私に

を与えるだろう、この場合、

w = 'w123 o456 (t789)' 

:私は今、私はこのような文字列がある場合があります

w123 o456 t789 

w = 'w123 o456 t789-- --' 

を回すことができます

w123 o456 (t789 

は、だから私は持っている、実際に密接に関連する2つの質問:

1)私は、特定の文字が保持されているような方法でコマンドre.sub(r'\D+$', '', w)を変更するにはどうすればよい(例えば、括弧)?

2)コマンドre.sub(r'\D+$', '', w)を修正して、特定の文字のみが削除されるようにするにはどうすればよいですか(ダッシュや空白など)?

EDIT

@Martinボナーの答えは、例えば非常に近いが取得します

w='w123 -o456 t789--) --' 

するためのコマンド

re.sub('[- ]+$', '', w) 

は私にw123 -o456 t789--)を与えるが、それはまた、残りのダッシュを取り除く必要があります。

+0

@MooingRawr:どうすれば使用できますか?あなたは例を挙げることができますか? – Cleb

答えて

1

コールバックで別のre.subを置換パターンとして使用できます。ここで

re.sub(r'\D+$', lambda m: re.sub(r'[^()]+','',m.group(0)), s) 

、あなたは、文字列の末尾に数字以外のすべてのシンボルに一致するコールバックにその値を渡し、()以外のすべてのシンボルは、その値から削除されます。

+0

素晴らしい!それはうまくいきます、たとえ編集上の病的なケースであっても! (upvoted)。 – Cleb

+0

私はあなたの問題に対する一般的な解決策であると信じています。価格は2つの正規表現の置き換えです。このアプローチを使用する場合は、正規表現オブジェクトをコンパイルするのを忘れないでください。 –

4

維持するために特定の文字()使用:

re.sub('[^0-9()]+$', '', w) 

は、行の末尾からのみ特定の文字を削除するには:角括弧で

re.sub('[- ]+$', '', w) 

、あなたがしたい文字を一覧表示することができます合わせる。最初の文字が^の場合は、を除く)のすべてが一致します。唯一の小さな問題は、-が通常範囲を指定していることです(したがって、 の10個をすべて列挙することなくすべての数字を指定できるようになります)。つまり、-を一致する文字の1つとして指定する場合は、の最初のにする必要があります。 (あなたが^を指定したい場合は、\でそれを脱出し、生の文字列に戻ります。)

をコメントから、私はあなたが実際に は、「文字列からすべてのダッシュやスペースを削除する第二の課題を意味だと思います最後の桁と行末の間にある "それは正規表現では可能かもしれませんが、3ヶ月後にコードを保持するために戻ってくる誰かがあなたを憎むでしょう(それはあなたかもしれません)。

一部の人々は、問題に直面したとき、今、彼らは二つの問題を持っている「私は、私は 正規表現を使用するでしょうね」と思う:ちょうどジェイミー・ザウィンスキーの引用を覚えています。

+0

うまく動作しているようですが、感謝しています(upvoted)!もう1つの質問: 're.sub( '[ - ] + $'、 ''、w)'の最後の数字の後ろにあるものをどこから削除したいかを指定しますか?あなたはどこで数字を探しますか? – Cleb

+0

たとえば 'w = 'w123 -o456 t789--) - ''私は 'w123 -o456 t789 - )'を得ます。他の2つのダッシュは残っていますが、削除する必要もあります。 – Cleb

+0

@Cleb Answer –

1

が3つの文字のグループと、各グループの先頭のは、単一の文字で常にあり、その後3桁の数字を持っており、唯一の最後のグループは、ブラケットを持っているかもしれませんが、この表現は、あなたが必要なものだけかもしれない場合は、次の

w = 'w123 o456 (t789)' 
clean = re.sub(r'^.*(\w\d{3})[ -]+(\w\d{3})[ -]+(\(?\w\d{3}\)?).*$', r'\1 \2 \3', w) 

cleanは、文字列の先頭または末尾に他の文字がある場合でも、'w123 o456 (t789)'を出力するようになりました。

この表現は、文字と3桁の3つの文字グループで構成されています。最後のグループには、オプションのブラケット(\(?\)?)があります。 3つのグループの前後のすべての文字は、^.*.*$と一致します。 \1 \2 \3

+0

これは 'w = 'w123 -o456 t789---' 'では機能しません。その後、ダッシュはまだ残っています。 – Cleb

+0

私の事例が更新されました。グループ間に出現する可能性のある他の文字がある場合はmiを教えてください。 – 4140tm

+0

それは例のために働くと思われるが、通常私はグループの数を事前に知らない...とにかく、あなたの努力のおかげで、私もそれをupvoted :) – Cleb

1

リストの補完を使用しないでください(特定の文字や数字を必要としない場合は、このオートで文字と数字が保持されます):

w = 'w123 o456 t789-- --' 
list_to_keep =[' '] 
print(''.join([x for x in w if x.isalnum() or x in list_to_keep])) 
>> w123 o456 t789 

w = 'w123 o456 (t789)' 
list_to_keep =[' '] # add to me 
print(''.join([x for x in w if x.isalnum() or x in list_to_keep])) 
>> w123 o456 t789 

例えば:

w = 'w123 o456 (t789)' 
list_to_keep =[' ', '('] # add to me (I added '(' to keep for example) 
print(''.join([x for x in w if x.isalnum() or x in list_to_keep])) 
>> w123 o456 (t789 

、それはあなたがマーティンは動作しませんと言って編集したものを不利に働く:

w='w123 -o456 t789--) --' 
list_to_keep =[' '] # add to me (I added '(' to keep for example) 
print(''.join([x for x in w if x.isalnum() or x in list_to_keep])) 
>> w123 o456 t789 
関連する問題