7

stackoverflow で同様のテーマをいくつか見つけましたが、私は Python と正規表現の初心者です。

私は文字列を持っています

,"2009 年に全面改装された 2 つ星のスーペリア ホテル イビス ベルリン メッセは、エアコン完備の 168 室の客室を備え、ベルリンの ICC とエキシビション センターのすぐ隣に位置しています。すべての客室で Wi-Fi を利用でき、無料でインターネットを利用できます。ロビーにある 2 台の iPoint-PC で有料. 24 時間営業のバー, スナックとレセプション サービス. ベルリンの素晴らしい景色を望む 8 階で、午前 4 時から午後 12 時までビュッフェ式朝食をお楽しみください.ホテルのすぐ隣に駐車場があります。",

パターンは次のようになりますcomma, double quote|any text with commas |double quote, comma。たとえば、文字でコンマを二重引用符で囲む必要があります@。どの正規表現パターンを使用する必要がありますか?

私はこれを試しました:

r',"([.*]*,[.*]*)*",' 

さまざまなバリエーションがありますが、機能しません。

答えてくれてありがとう、問題は解決しました。

4

4 に答える 4

2

パターンが常に記述どおりである場合、次のコード スニペットで目的の処理が実行されます。

text = ',' + text[1:-2].replace(',', '@') + ','

討論

  • text[1:-2]最初と最後の文字(コンマ)を除いた元の文字列が得られます
  • .replace()次に、すべてのコンマをアットマークに変えるように呼び出します
  • 最後に、最初と最後のカンマを元に戻して、結果の文字列を形成します
于 2013-08-14T15:52:02.027 に答える
2

うーん、あなたの正規表現は疑わしいです。

,"([.*]*,[.*]*)*",

[.*]リテラルのドットまたはアスタリスクのいずれかに一致します (文字クラスのリテラルになります) .*

さらに、これが実際に文字列内の何かと一致する場合、文字列の残りの部分 (カンマを含む) は正規表現によって消費され、一度消費されると再度置換できないため、カンマを 1 つだけ置き換えることができます。置き換えるコンマがなくなるまでループを実行します。

これらのコンマを使用して置き換えることができるのはre.sub、ルックアラウンドを使用することです(グーグルで検索できます。それらに関する十分なドキュメントがあると思います)。二重引用符のペアが 1 つしかない場合は、コンマとそれに続く 1 つの二重引用符のみが置き換えられるようにすることができます。

,(?=[^"]*"[^"]*$)

[^"]二重引用符ではない文字を意味します。[^"]*これが 0 回以上繰り返されることを意味します。

$は行の終わりを意味します。

ここで、先読み(?= ... )により、カンマの前に何が入っているかが確認されます。

ここで一致するコンマを参照してください。

その後、コンマを必要な値に置き換えるだけです。

str = re.sub(r',(?=[^"]*"[^"]*$)', '@', str)

ただし、複数の二重引用符がある場合は、前に奇数個の二重引用符があることを確認する必要があります。これは、正規表現を使用して行うことができます。

,(?=[^"]*"[^"]*(?:"[^"]*"[^"]*)*$)

(?: ... )ちなみに非捕獲派です。

于 2013-08-14T15:41:21.097 に答える
2

これを試すことができます(ただし、非常に致命的です)。ここでの秘訣は、二重引用符のペア内の任意の文字のに、奇数個の二重引用符が続くということです。もちろん、二重引用符のバランスが取れていると仮定します。

s = 'some comma , outside "Some comma , inside" , "Completely , renovated in 2009",'

import re
s = re.sub(r',(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)', "@", s)
print s

出力:

some comma , outside "Some comma @ inside" , "Completely @ renovated in 2009",
于 2013-08-14T15:41:46.447 に答える