【问题标题】:Python: Replace tags but preserve inner text V2Python:替换标签但保留内部文本 V2
【发布时间】:2010-12-09 03:20:51
【问题描述】:

我有一个脚本来进行搜索和替换。它基于脚本here。 它被修改为接受文件作为输入,但它似乎不能很好地识别正则表达式。

脚本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
import re
import glob

_replacements = {
    '[B]': '**',
    '[/B]': '**',
    '[I]': '//',
    '[/I]': '//',

}

def _do_replace(match):
    return _replacements.get(match.group(0))

def replace_tags(text, _re=re.compile('|'.join((r) for r in _replacements))): 
    return _re.sub(_do_replace, text)

def getfilecont(FN):
    if not glob.glob(FN): return -1 # No such file
    text = open(FN, 'rt').read()
    text = replace_tags(text, re.compile('|'.join(re.escape(r) for r in _replacements)))
    return replace_tags(text)

scriptName = os.path.basename(sys.argv[0])
if sys.argv[1:]:
    srcfile = glob.glob(sys.argv[1])[0]
else:
    print """%s: Error you must specify file, to convert forum tages to wiki tags!
            Type %s FILENAME """ % (scriptName, scriptName)
    exit(1)
dstfile = os.path.join('.' , os.path.basename(srcfile)+'_wiki.txt')
converted = getfilecont(srcfile)
try:
    open(dstfile, 'wt+').write(converted)
    print 'Done.'
except:
    print 'Error saving file %s' % dstfile

print converted
#print replace_tags("This is an [[example]] sentence. It is [[{{awesome}}]].")  

我想要的是替换

'[B]': '**',
'[/B]': '**',

在正则表达式中只有这样一行

\[B\](.*?)\[\/B\] : **\1**

这样的 BBcode 标签会很有帮助:

[FONT=Arial]Hello, how are you?[/FONT]

然后我可以使用这样的东西

\[FONT=(.*?)\](.*?)\[\/FONT\] : ''\2''

但我似乎无法用这个脚本做到这一点。还有另一种方法可以在此脚本的原始源中进行正则表达式搜索和替换,但它使用 re.sub 一次只适用于一个标签。这个脚本的其他优点是我可以添加任意多的行,以便以后更新。

【问题讨论】:

    标签: python regex replace


    【解决方案1】:

    对于初学者,您正在转义这一行的模式:

    text = replace_tags(text, re.compile('|'.join(re.escape(r) for r in _replacements)))
    

    re.escape 接受一个字符串并将其转义,如果将新字符串用作正则表达式,它将与输入字符串完全匹配。

    但是,删除 re.escape 并不能完全解决您的问题,因为您只需在此行的 dict 中查找匹配的文本即可找到替换:

    return _replacements.get(match.group(0))
    

    要解决此问题,您可以将每个模式放入其自己的捕获组:

    text = replace_tags(text, re.compile('|'.join('(%s)' % r for r in _replacements)))
    

    您还需要知道哪种模式与哪种替换相匹配。这样的事情可能会奏效:

    _replacements_dict = {
        '[B]': '**',
        '[/B]': '**',
        '[I]': '//',
        '[/I]': '//',
    }
    _replacements, _subs = zip(*_replacements_dict.items())
    
    def _do_replace(match):
        for i, group in m.groups():
            if group:
                return _subs[i]
    

    请注意,这会将_replacements 更改为模式列表,并为实际替换创建一个并行数组_subs。 (我会将它们命名为正则表达式和替换,但不想重新编辑每次出现的“_replacements”)。

    【讨论】:

      【解决方案2】:

      有人已经做到了here

      #!/usr/bin/env python
      # -*- coding: utf-8 -*-
      import sys, os
      import re
      import glob
      
      _replacements_dict = {
          '\[B\]': '**',
          '\[\/B\]': '**',
          '\[I\]': '//',
          '\[\/I\]': '//',
          '\[IMG\]' : '{{',
          '\[\/IMG\]' : '}}',
          '\[URL=(.*?)\]\s*(.*?)\s*\[\/URL\]' : r'[[\1|\2]]',
          '\[URL\]\s*(.*?)\s*\[\/URL\]' : r'[[\1]]',
          '\[FONT=(.*?)\]' : '',
          '\[color=(.*?)\]' : '',
          '\[SIZE=(.*?)\]' : '',
          '\[CENTER]' : '',
          '\[\/CENTER]' : '',
          '\[\/FONT\]' : '',
          '\[\/color\]' : '',
          '\[\/size\]' : '',
      }
      _replacements, _subs = zip(*_replacements_dict.items())
      
      def replace_tags(text):
          for i, _s in enumerate(_replacements):
              tag_re = re.compile(r''+_s,  re.I) 
              text, n = tag_re.subn(r''+_subs[i], text)
          return text
      
      
      def getfilecont(FN):
          if not glob.glob(FN): return -1 # No such file
          text = open(FN, 'rt').read()
          return replace_tags(text)
      
      scriptName = os.path.basename(sys.argv[0])
      if sys.argv[1:]:
          srcfile = glob.glob(sys.argv[1])[0]
      else:
          print """%s: Error you must specify file, to convert forum tages to wiki tags!
                  Type %s FILENAME """ % (scriptName, scriptName)
          exit(1)
      dstfile = os.path.join('.' , os.path.basename(srcfile)+'_wiki.txt')
      converted = getfilecont(srcfile)
      try:
          open(dstfile, 'wt+').write(converted)
          print 'Done.'
      except:
          print 'Error saving file %s' % dstfile
      
      #print converted
      #print replace_tags("This is an [[example]] sentence. It is [[{{awesome}}]].")
      

      http://pastie.org/1447448

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-27
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-06
        • 1970-01-01
        相关资源
        最近更新 更多