質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

pythonでreplaceとstripを用いて単語(接続詞)を削除し、文を個別でリストに格納するときのエラー

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 171

tenjin

score 270

前提・実現したいこと

実現したいことはPythonのreplaceとstrip関数を用いて、単語(接続詞)を削除して、別の文として配列に格納することです。

具体的には以下の出力を実現したいです。

text1 = 'The fire snapped as it grew.'
text2 = 'Tom cooks dinner and Alice washes her hand.'

#出力
['The fire snapped', 'it grew.']
['Tom cooks dinner', 'Alice washes her hand.']

pythonでstripを用いるとリストで指定していない単語まで削除されるエラー」という前に投稿した質問と単語を削除する部分で実現したい同じなので、関連します。

発生している問題・エラーメッセージ

現在のコードで、text1はうまくいっているのですが、テキスト2で以下のように失敗してしまいます。
どのように修正すべきかアドバイスをいただきたいです。

['The fire snapped', 'it grew.']
['Tom cook dinner and Alice w', 'h her hand.']

該当のソースコード

text = 'Tom cooks dinner and Alice washes her hand.'
ignore_words = ['as', 'and']

ret = []
for word in text.split(' '):
    ignore = len(word) <= 0 # スペースは不要
    for iw in ignore_words:
        if word == iw:
            ignore = True
            text = text.replace(word,',').strip()
            break

text = [x.strip() for x in text.split(',') if not x.strip() == '']
print(text)

試したこと

pythonでstripを用いるとリストで指定していない単語まで削除されるエラー」という前に投稿した質問でいただいたご回答は、実際に自分でも動かしてみて、今回のコードを作成する時に、参考にさせていただきました。

text = 'The  fire snapped as it grew.'
ignore_words = ['as', 'it']

ret = []
for word in text.split(' '):
    ignore = len(word) <= 0 # スペースは不要
    for iw in ignore_words:
        if word == iw:
            ignore = True
            break
    if not ignore:
        ret.append(word)

text = ' '.join(ret)
print(text)

#出力
The fire snapped grew.

補足情報(FW/ツールのバージョンなど)

Python 3.7.4
jupyter-notebook : 6.0.3

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

こんな感じでしょうか。

ignore_words = ['as', 'and']
for text in ['The fire snapped as it grew.', 'Tom cooks dinner and Alice washes her hand.', 'The sun is the sun and as it was.']:
    tmp = []
    for word in text.split(' '):
        if len(word) > 0: # スペースは不要
            for iw in ignore_words:
                if word == iw:
                    word = '\b' # 文章の区切り
                    break
            tmp.append(word)

    text = ' '.join(tmp)
    lst = [sen.strip() for sen in text.split('\b') if len(sen.strip()) > 0] # 文章で区切って、文章の前後のスペースは除去
    print(lst)

# ['The fire snapped', 'it grew.']
# ['Tom cooks dinner', 'Alice washes her hand.']
# ['The sun is the sun', 'it was.']

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

replace()を使うと、文章中のすべての「as」や「and」が(たとえ単語中にあっても)置換されてしまう。
「見つかった最初の1個だけ置換」を指定することもできるが、それが目的の「as」や「and」だとは限らない。

#text = 'The fire snapped as it grew. as'
text = 'Tom cooks dinner and Alice washes her hand. and'
ignore_words = ['as', 'and']

ret = []
newtext = ''
for word in text.split(' '):
    if len(word) <= 0:
        continue
    if not word in ignore_words:
        newtext += word + ' '
        continue
    newtext = newtext.strip()
    if newtext:
        ret.append(newtext)
    newtext = ''

newtext = newtext.strip()
if newtext:
    ret.append(newtext)

print(ret)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

text = 'Tom cooks dinner and Alice washes her hand.'
#text = 'The fire snapped as it grew.'

ignore_words = ['as', 'and']

ret = []
ret_text = []
wk_ret = ""

"""
def find_NG_word(wk_str):
    for NG_text in ignore_words
"""    
for wk_text in text.split():
    #print (wk_text)
    if  not wk_text in ignore_words:

        wk_ret += wk_text + " "
    else:
        wk_ret = wk_ret[:-1]
        ret_text.append(wk_ret)    
        wk_ret = ""

wk_ret = wk_ret[:-1]
ret_text.append(wk_ret)   

print(ret_text)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Pythonに関する質問
  • pythonでreplaceとstripを用いて単語(接続詞)を削除し、文を個別でリストに格納するときのエラー