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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

4回答

1161閲覧

文字列を置換するときに意図していない文字まで置き換わる問題について

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2020/08/23 15:35

編集2020/08/23 23:11

前提・実現したいこと

以下のように入力した文のheをJohnに変える処理をしようとしています。

The apple was that he got from the orchard The apple was that John got from the orchard

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

現在のプログラムだとThetheの「he」も置き換わってしまっているのですが、どうすればこのような問題を回避できるのでしょうか。

検索でのキーワードもわからず、何も試すことができていない状況です。

TJohn apple was that John got from tJohn orchard

該当のソースコード

Python

1text = "The apple was that he got from the orchard" 2text = text.replace('he', 'John') 3print(text)

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

Python 3.6

ご回答を受けての追記

ご回答でいただいたように、正規表現で処理しようとする場合、もし以下のように置換したい文字列が変数に書くのされていた場合、うまく置換できないという問題に直面しました。

この問題についても、可能であれば解決方法を伺いたいです。

python

1import re 2 3original = 'he' 4name = 'John' 5 6text = "The apple was that he got from the orchard" 7text = re.sub(r'\boriginal\b', name, text) 8print(text) 9 10#出力 11The apple was that he got from the orchard

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

正規表現を使います。正規表現だと「英数字の並びとそれ以外の境目」にマッチする\bがあるので、

Python

1import re 2 3text = "The apple was that he got from the orchard" 4text = re.sub(r'\bhe\b', 'John', text) 5print(text)

つまり、\bhe\bは「heで直前直後が英数字でないもの」にマッチします。単語単位のマッチと言うことですね。

投稿2020/08/23 15:53

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/23 23:12

ご回答ありがとうございます。ご回答を受けての追記をさせていただきました。
otn

2020/08/24 00:29

> text = re.sub(r'\boriginal\b', name, text) 変数の扱い方レベルから復習ですね。 文字列リテラルの中に変数名をそのまま書いてもダメです。 他の方法もありますが、まずは初歩の方法で。 text = re.sub(r'\b'+original+'\b', name, text)
guest

0

追記への回答ですが、引用符に囲まれたままで変数として認識されてないからです。
+演算子などで文字列と変数を連結すればいいというだけの話ですが、
下の例に書いてある文字埋め込みを使った方が簡単でしょうね。

python

1import re 2 3original = 'he' 4name = 'John' 5 6text = "The apple was that he got from the orchard" 7text1 = re.sub(r'\b' + original + r'\b', name, text) 8print(text1) 9 10''' 11The apple was that John got from the orchard 12''' 13 14text = "The apple was that he got from the orchard" 15text2 = re.sub(rf'\b{original}\b', name, text) 16print(text2) 17 18''' 19The apple was that John got from the orchard 20'''

投稿2020/08/24 00:29

yureighost

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

python

1text = text.replace(' he ', ' John ')

でよいかと。

投稿2020/08/23 23:33

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/23 23:35 編集

置換時に前後まで指定するのは、ワリとよくやる方法です。
Zuishin

2020/08/23 23:38

he が先頭または末尾にある場合を考えて置換元文字列の前後にスペースを置いておきたいですね。
退会済みユーザー

退会済みユーザー

2020/08/23 23:53

まぁ要件次第では正規表現でしょうね。 先頭`he ` , 末尾 ` he` or ` he.`も置換。ってとこまで replace でやるかっていうと、さすがに正規表現使いそうw 末尾ってありえるのかなぁ。。。
Zuishin

2020/08/24 00:08

置換対象が he とは限らないようなので、orchard なら末尾になります。約物が入ってくるなら厳しいですね。
退会済みユーザー

退会済みユーザー

2020/08/24 00:18

正規表現イヤイヤ期の俺としては正規表現なしでごり押ししたいとこですけど、要件的に想定される約物とか区切り文字列が複数あるなら、正規表現でしょうね。
ikadzuchi

2020/08/24 15:12

「 he he 」のように連続した場合に1つしか置換されない問題がありますね。
退会済みユーザー

退会済みユーザー

2020/08/29 03:15

あれ?これなんで置換されないんでしたっけ?
ikadzuchi

2020/08/29 08:47

全置換のとき、置換済みの箇所は次の置換の対象にならないようです。
退会済みユーザー

退会済みユーザー

2020/08/29 12:24

再帰的に読み直さないってことなんですかね? 指摘ありがとうございます。認識してない箇所でした^^;
退会済みユーザー

退会済みユーザー

2020/08/29 12:26

前後のスペースで考えるから違和感があるだけで、普通の文字列で考えるとごく普通の仕様ですね。 いずれにしても考慮漏れだったので、気が付けてよかったです。
guest

0

ベストアンサー

正規表現で置換する方法が有効です。
参考:re.sub()

python

1import re 2text = "The apple was that he got from the orchard" 3text = re.sub('\she\s', '\sJohn\s',text)

投稿2020/08/23 15:45

nekoniki

総合スコア2411

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/23 23:12

ご回答ありがとうございます。ご回答を受けての追記をさせていただきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問