2017-08-21 4 views
0

一連のメッセージであるデータフレーム内の列を持つ。各文字列は、異なる長さの '文字'のブロックを置き換えなければなりません。それは次のようになります。Python 3.6で( ')の間にある文字列の部分文字列を置換する

Index Message  
0  The value '0000' is not valid. 
1  The value 'GA1234' for <category> must be changed. 
2  The value '.30' is not a valid entry. 
3  The value 'Invitation for Party' is not valid. 
4  On line '0010', the value 'CARD' is invalid. 

( ')の間に直列にすべての文字列を置換する方法がわかりません。

しようとしました:df.Message.str.replace( "値 '%'"、 '値XXXXX')が、運。

試行:df.Message.str.find( "'")これは最初のアポストロフィの位置を示しますが、2番目のアポストロフィを見つける方法についてはわかりません。

2つの部分文字列( ')の間に部分文字列を入れて' XXXXX 'と置き換える方法はありますか?

+0

df.Message.replace(r"'[^']+'", 'XXXXX', regex=True) 

デモ:あなたはregex=Trueを設定した場合、それは、本質的にシリーズ内のすべての値についてre.sub()呼び出しとして機能する、あまりにも正規表現を取りますこれが[正規表現](https://docs.python.org/3/howto/regex.html)の目的です。 –

+1

特にエスケープ文字の可能性がある場合は、はい、正規表現。たとえば、 '' That \ 's a test'のような値を扱う方法 –

+0

正規表現を使用したことはありません。 "import re"で始まったが、まだ理解していない例をいくつか見た。 –

答えて

2

は、正規表現の使用:上記

import re 

pattern = re.compile(r"'[^']+'") # 1 or more characters between single quotes 
result = pattern.sub('XXXXX', inputtext) 

のみ(自分自身は何もなく、単一引用符です)の間で1つ以上の文字を持つ2つの単一引用符を受け入れます。

は、このようなパターンを使用する方法の良い導入のためのPythonのドキュメントに含まRegular Expression HOWTOを参照してください。

デモ:

>>> import re 
>>> pattern = re.compile(r"'[^']+'") 
>>> pattern.sub('XXXXX', "The value '0000' is not valid.") 
'The value XXXXX is not valid.' 
>>> pattern.sub('XXXXX', "The value 'GA1234' for <category> must be changed.") 
'The value XXXXX for <category> must be changed.' 
>>> pattern.sub('XXXXX', "The value '.30' is not a valid entry.") 
'The value XXXXX is not a valid entry.' 
>>> pattern.sub('XXXXX', "The value 'Invitation for Party' is not valid.") 
'The value XXXXX is not valid.' 
>>> pattern.sub('XXXXX', "On line '0010', the value 'CARD' is invalid.") 
'On line XXXXX, the value XXXXX is invalid.' 

あなたはパンダシリーズを持っている場合は、Series.replace()を使用します。 RegEx'esを受け入れ

>>> import pandas as df 
>>> df = pd.DataFrame({ 
...  'Message': pd.Series([ 
...   "The value '0000' is not valid.", 
...   "The value 'GA1234' for <category> must be changed.", 
...   "The value '.30' is not a valid entry.", 
...   "The value 'Invitation for Party' is not valid.", 
...   "On line '0010', the value 'CARD' is invalid.", 
...  ]) 
... }) 
>>> df.Message.replace(r"'[^']+'", 'XXXXX', regex=True) 
0      The value XXXXX is not valid. 
1 The value XXXXX for <category> must be changed. 
2    The value XXXXX is not a valid entry. 
3      The value XXXXX is not valid. 
4   On line XXXXX, the value XXXXX is invalid. 
Name: Message, dtype: object 
+0

また、 'pattern.search("値 '0000'は無効です)。group() 'を使って、一致するテキストだけを見つけることができます。 – Kos

+0

パターン= re.compile(R " '[^'] +"」) DF [ '改訂'] = pattern.sub( 'XXXXXX'、df.Message) はタイプエラーを取得:予測文字列やバイトのようなオブジェクト。 –

+0

@ ArthurD.Howland: 'Series.apply()'を使い、 'Series'全体を' pattern.sub(..) 'に渡さないでください。 –

3

Series.str.replace()

In [184]: df 
Out[184]: 
    Index           Message 
0  0      The value '0000' is not valid. 
1  1 The value 'GA1234' for <category> must be chan... 
2  2    The value '.30' is not a valid entry. 
3  3  The value 'Invitation for Party' is not valid. 
4  4  On line '0010', the value 'CARD' is invalid. 

In [185]: df['Message'] = df['Message'].str.replace(r"'.*?'", 'XXXXX') 

In [186]: df 
Out[186]: 
    Index           Message 
0  0     The value XXXXX is not valid. 
1  1 The value XXXXX for <category> must be changed. 
2  2   The value XXXXX is not a valid entry. 
3  3     The value XXXXX is not valid. 
4  4  On line XXXXX, the value XXXXX is invalid. 
+1

これは適切な 'pandas'応答(ある - :私はマルタインの正規表現のように行いますが – piRSquared

+0

@piRSquared、ありがとう – MaxU

+0

パンダのバージョンは、私が.str.replace(Rを学ばなければならない作品、。!!「『*。?』」 'XXXXX')私はそれらのワイルドカードを見つけることができる場所を探すでしょうが、それは多くの助けになりますまた、私はそれを学ぶことができるように正規表現の方法を探しています –

関連する問題