0

次のような文字列があります。

str1 = "/path/happy (dog)"

何らかの目的で、次のようにしたい:

str2 = "/path/happy\ \(dog\)"

reを使ってみました:

str1 = "happy (dog)"
tuple_1 = ('\s+','(',')')


for i in tuple_1:

   match = re.search(r"("+i+")",str1)

   if match:
      str1 = re.sub(match.group(),"\\"+match.group(),str1)

print str1

しかし、それはエラーを出します:

sre_constants.error: unbalanced parenthesis

私はここで何かが欠けていることを知っています...

4

3 に答える 3

2

i が '(' の場合、結果の正規表現は '(()' になります。開き括弧が 2 つと閉じ括弧が 1 つです。したがって、エラー メッセージ「括弧のバランスが取れていません」が表示されます。

tuple_1 の 2 つの括弧をエスケープする必要があります。

tuple_1 = (r'\s+', r'\(', r'\)')
于 2013-03-13T14:10:00.610 に答える
2

括弧などの特殊文字をエスケープする必要があります。

tuple_1 = (r'\s+', r'\(', r'\)')

それ以外の場合は、代わりに正規表現文字として解釈されます。

于 2013-03-13T14:06:27.327 に答える
1

有効で重要な他の回答で言及されている変更を適用しても(タプル内の検索語をエスケープします)、それでも

Traceback (most recent call last):
  File "<pyshell#4>", line 6, in <module>
    str1 = re.sub(match.group(),"\\"+match.group(),str1)
error: unbalanced parenthesis

しかし、今回は別の行で。したがって、正規表現のサブ関数を使用する場合、最初のパラメーターは有効な正規表現である必要があります。match.group()何でもかまいませんし、必ずしもバランスが取れているとは限りません。これは、正規表現が窒息している場所です。したがって、から文字列を取得してmatch.group()エスケープできるため、リテラルを検索しています。これにより、行を次のように変更します

str1 = re.sub(re.escape(match.group()),"\\"+match.group(),str1)

一方、パターンを 1 回コンパイルするだけで、それを覚えておくことができます。

pattern = re.compile(r"("+i+")")
str1 = re.sub(pattern,"\\"+match.group(),str1)

最終的なコードは次のとおりです。

str1 = "/path/happy (dog)"
tuple_1 = (r'\s+', r'\(', r'\)')
for i in tuple_1:
     pattern = re.compile(r"("+i+")")

     match = pattern.search(str1)

     if match:
         str1 = re.sub(pattern,"\\"+match.group(),str1)

str1 は現在'/path/happy\\ \\(dog\\)'

于 2013-03-13T15:22:44.760 に答える