0

Pythonで単語クラウドプログラムの作成に取り組んでいますが、単語置換機能で行き詰まっています。htmlファイル内の一連の数字を(文字列で作業しているので)順序付きリストの単語に置き換えようとしています。したがって、リストの最初の単語、2番目の単語など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      
4

2 に答える 2

4

これは実際には本当に単純なリスト内包表記です:

>>> 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()(編集終了)

私たちが行うことは、テキストを個々の数字に分割し、それらを整数に変換し、それらを使用して、単語を見つけるために指定したリストにインデックスを付けることです。

コードが機能しない理由については、主な問題は文字列をループしていることです。これにより、単語ではなく文字が表示されます。ただし、これはタスクを解決するための優れた方法ではありません。

また、値をループしてインデックスをそれらに合わせたい場合は、カウント変数を使用するのではなくenumerate()組み込みを使用する必要があることにも注意してください。

例:代わりに:

y = -1
for w in text:
    y = y + 1
    ...

使用する:

for y, w in enumerate(text):
    ...

これははるかに読みやすく、Pythonicです。

既存のコードのもう1つの点は、次のとおりです。

w = {x:a}      
for i, j in w.iteritems():
    text = text.replace(i, j)

あなたがそれについて考えるならば、それは以下に単純化されます:

text = text.replace(x, a)

1つのアイテムの辞書に設定wし、それをループしますが、1つのアイテムしか含まれないことがわかります。

あなたの方法にもっと厳密に従う解決策は次のようになります:

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を使用しているので、が必要になることに注意してください。2.7よりdict.iteritems()前の場合は、dict()dict内包表記が存在しないため、タプルのジェネレーターに組み込まれているものを使用してください。

于 2012-12-09T02:13:36.247 に答える
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)
于 2012-12-09T02:37:49.010 に答える