19

これが私の問題です。テキストでコンマを含む変数で、2つの文字列(実際にはと[)の間にあるコンマだけを削除しようとします]。たとえば、次の文字列を使用します。

input =  "The sun shines, that's fine [not, for, everyone] and if it rains, it Will Be better."
output = "The sun shines, that's fine [not for everyone] and if it rains, it Will Be better."

変数全体の使い方は知って.replaceいますが、一部は使えません。このサイトにはいくつかのトピックが近づいていますが、私は自分の質問のためにそれらを利用することができませんでした。

4

4 に答える 4

31
import re
Variable = "The sun shines, that's fine [not, for, everyone] and if it rains, it Will Be better."
Variable1 = re.sub("\[[^]]*\]", lambda x:x.group(0).replace(',',''), Variable)

まず、書き直す必要のある文字列の部分を見つける必要があります(これはで行いますre.sub)。次に、その部分を書き直します。

この関数の意味は次のとおりです。;に準拠するvar1 = re.sub("re", fun, var)te変数内のすべてのサブストリングを検索します。関数でそれらを処理します; 結果を返します。結果は変数に保存されます。var"re"funvar1

正規表現"[[^]]*]"は、(re)で始まり、(re)を除くすべてを含み、(re)で終わる部分文字列を検索すること[\[意味][^]]*ます。]\]

見つかったオカレンスごとに、このオカレンスを新しいものに変換する関数を実行します。関数は次のとおりです。

lambda x: group(0).replace(',', '')

つまり、()を見つけた文字列を取得し、(つまり、削除group(0))に置き換え','て、結果を返します。'',

于 2012-06-19T08:02:35.357 に答える
4

次のような式を使用して、それらを一致させることができます(角かっこがバランスしている場合)。

,(?=[^][]*\])

次のようなものを使用しました:

re.sub(r",(?=[^][]*\])", "", str)
于 2012-06-19T08:00:02.487 に答える
0

これが非正規表現の方法です。[]区切り文字をsay[//]、に置き換えてからsplit、区切り文字に置き換えることができます/odd次に、分割リスト内のすべての文字列をcomma削除のために処理する必要があります。これは、リスト内包表記で文字列を再構築するときに実行できます。

>>> Variable = "The sun shines, that's fine [not, for, everyone] and if it rains,
                it Will Be better."
>>> chunks = Variable.replace('[','[/').replace(']','/]').split('/')
>>> ''.join(sen.replace(',','') if i%2 else sen for i, sen in enumerate(chunks))
"The sun shines, that's fine [not for everyone] and if it rains, it Will Be 
 better."
于 2012-06-19T08:31:45.493 に答える
-1

正規表現を習得したくない場合は(このページの他の応答を参照)、partitionコマンドを使用できます。

sentence = "the quick, brown [fox, jumped , over] the lazy dog"
left, bracket, rest = sentence.partition("[")
block, bracket, right = rest.partition("]")

「ブロック」はブラケット間の文字列の一部になり、「左」はオープニングブラケットの左側にあり、「右」はオープニングブラケットの右側にあります。

その後、次のコマンドで全文を復元できます。

new_sentence = left + "[" + block.replace(",","") + "]" + right
print new_sentence # the quick, brown [fox jumped over] the lazy dog

複数のブロックがある場合は、これをすべてforループに入れて、すべてのステップで「右」にパーティションコマンドを適用できます。

または、正規表現を学ぶことができます!長期的にはそれだけの価値があります。

于 2012-06-19T08:16:11.230 に答える