我正在使用Python创建一个单词云程序,而我却陷入了单词替换功能。我试图用一个有序列表中的单词替换html文件中的一组数字(所以我正在使用一个字符串)。因此000
将替换为列表中的第一个单词,001
替换为第二个单词等。
所以下面我选择了正确替换w
的单词,但我无法用字符串中的单词正确替换它。任何帮助表示赞赏。谢谢!
def replace_all():
text = '000 001 002 003 '
word = ['foo', 'bar', 'that', 'these']
for a in word:
y = -1
for w in text:
y = y + 1
x = "00"+str(y)
w = {x:a}
for i, j in w.iteritems():
text = text.replace(i, j)
print text
答案 0 :(得分:4)
这实际上是一个非常简单的list comprehension:
>>> text = '000 001 002 003 '
>>> words = ['foo', 'bar', 'that', 'these']
>>> [words[int(item)] for item in text.split()]
['foo', 'bar', 'that', 'these']
编辑:如果您需要保留其他值,可以满足以下条件:
def get(seq, item):
try:
return seq[int(item)]
except ValueError:
return item
然后简单地使用[get(words, item) for item in text.split()]
之类的东西 - 当然,如果字符串中有其他数字可能会被意外替换,则可能需要在get()
中进行更多测试。 (编辑结束)
我们所做的是将文本拆分为单个数字,然后将它们转换为整数,并使用它们索引您为查找单词而提供的列表。
至于为什么你的代码不起作用,主要问题是你循环遍历字符串,这将给你字符,而不是单词。但是,这不是解决任务的好方法。
值得一提的是,当你循环遍历值并希望索引与它们一起使用时,你应该使用the enumerate()
builtin而不是使用计数变量。
E.g:而不是:
y = -1
for w in text:
y = y + 1
...
使用:
for y, w in enumerate(text):
...
这更具可读性和Pythonic。
现有代码的另一个问题是:
w = {x:a}
for i, j in w.iteritems():
text = text.replace(i, j)
如果您考虑一下,请简化为:
text = text.replace(x, a)
您将w
设置为一个项目的字典,然后循环显示它,但您知道它只会包含一个项目。
更紧密地遵循您的方法的解决方案将是这样的:
words_dict = {"{0:03d}".format(index): value for index, value in enumerate(words)}
for key, value in words_dict.items():
text = test.replace(key, value)
我们从零填充数字字符串(使用str.format()
)到值创建字典,然后替换每个项目。请注意,当您使用2.x时,您需要dict.iteritems()
,如果您是2.7之前,请在元组生成器上使用dict()
内置,因为不存在dict理解。
答案 1 :(得分:0)
在处理文本时,显然必须考虑正则表达式。
import re
text = 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>')
words = ['XXX-%04d-YYY' % a for a in xrange(1000)]
regx = re.compile('(?<=>)\d+(?=</span>)')
def gv(m,words = words):
return words[int(m.group())]
print regx.sub(gv,text)