使用Python替换字符串中的单词与列表中的项目

时间:2012-12-09 14:48:43

标签: python string list enumerate

我正在努力用Python创建一个词云计算,而且我还遇到了一个单词替换功能。我试图用一个有序列表中的单词替换html文件中的一组数字(所以我使用字符串)。所以000将被替换为列表中的第一个单词,001替换为第二个单词等等。

以下方法在移动相对简单的字符串时起作用:

def textReplace():  
  text = '000 this is 001 some 002 text 003 '
  word = ['foo', 'bar', 'that', 'these']
  for a in word:    
    for y, w in enumerate(text):      
      x = "00"+str(y)
      text = text.replace(x, a)
  print text 

我正在通过一个html文件工作(我将文件的一部分放在下面的字符串中)而不是用列表中的连续项替换000,001,002等的每个实例,它将所有数字替换为第一项。为什么这个方法适用于上面的字符串,但不适用于下面的字符串。任何帮助表示赞赏。谢谢!

def htmlReplace():
  text = '<p><span class="newStyle0" style="left: 291px; top: 258px">000</span></p> <p><span class="newStyle1" style="left: 85px; top: 200px">001</span></p> <p><span class="newStyle2" style="left: 580px; top: 400px; width: 167px; height: 97px">002</span></p> <p><span class="newStyle3" style="left: 375px; top: 165px">003</span></p>'
  word = ['foo', 'bar', 'that', 'these']
  for a in word:    
    for y, w in enumerate(text):      
      x = "00"+str(y)
      text = text.replace(x, a)
  print text            

2 个答案:

答案 0 :(得分:1)

这样的东西写得更好(对于你的非HTML):

>>> text = '000 this is 001 some 002 text 003'
>>> word = ['foo', 'bar', 'that', 'these']
>>> word_list = iter(word)
>>> import re
>>> re.sub(r'\d+', lambda L: next(word_list), text)
'foo this is bar some that text these'

答案 1 :(得分:0)

不幸的是,你的方法对于这类问题是完全错误的,因为它们是Template Engines的良好候选者。

您可以尝试使用可用模板引擎的数量,或者我可以建议Jinja2,这将符合您的目的 以下是Jinja2

的示例
>>> text = """
{% for style in styles %}
<p><span class="newStyle{{ style.styleno }}"
{% for orin in style.orin %}
style="{{ orin.orin }}: {{ orin.attrib }}px
{% endfor %}
">{{ style.val }}</span></p>
{% endfor %}
"""
>>> styles = [{'no':1,
           "orin":[{"orin":"left", "attrib":291},
               {"orin":"top", "attrib":258}],
           "val":"000"},
           {'no':2,
        "orin":[{"orin":"left", "attrib":100},
            {"orin":"top", "attrib":222},
            {"orin":"height", "attrib":222},
            {"orin":"width", "attrib":222}],
        "val":"001"}]
>>> template = Template(text)
>>> template.render(styles = styles)
u'\n\n<p><span class="newStyle"\n\nstyle="left: 291px\n\nstyle="top: 258px\n\n">000</span></p>\n\n<p><span class="newStyle"\n\nstyle="left: 100px\n\nstyle="top: 222px\n\nstyle="height: 222px\n\nstyle="width: 222px\n\n">001</span></p>\n'
>>>