1

私がやりたいことは、特定のテキストで特定の置換を行うことです。たとえば、'<' は '[' に、'>' は ']' などに変更する必要があります。これは、次のソリューションに似ています: Python で正規表現を使用して複数の置換を行うにはどうすればよいですか? 、つまり

import re 

def multiple_replace(dict, text):
  # Create a regular expression  from the dictionary keys
  regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))

  # For each match, look-up corresponding value in dictionary
  return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text) 

さて、問題は、正規表現に一致するパターンも置き換えたいということです。たとえば、「fo.+」を「foo」に、「ba[rz]*」を「bar」に置き換えたいとします。

コード内の map(re.escape を削除すると、正規表現が実際に一致するようになりますが、重要なエラーが表示されます。は辞書のキーではなく、リテラル文字列 'ba[rz]*' です。この関数を変更して機能させるにはどうすればよいですか?

(関係のない話ですが、これらの「foo」と「bar」はどこから来たのですか?)

4

2 に答える 2

2

複数のsub呼び出しを行うだけです。

関係のないメモとして、Jargon File を参考にしてください: Metasyntactic variables , foo .

于 2013-07-11T02:33:28.037 に答える
2
import re

def multiple_replace(dict, text):
  # Create a regular expression  from the dictionary keys
  regex = re.compile(r'(%s)' % "|".join(dict.keys()))
  return regex.sub(lambda mo: dict[
      [ k for k in dict if
      re.search(k, mo.string[mo.start():mo.end()])
      ][0]], text)

d = { r'ba[rz]*' : 'bar', '<' : '[' }
s = 'barzzzzzz <'

print multiple_replace(d, s)

与えます:

bar [
于 2013-07-11T02:38:21.343 に答える