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

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

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

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

Q&A

解決済

2回答

4438閲覧

Python 文字列の差分を抽出したい

tom57

総合スコア29

Python

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

0グッド

0クリップ

投稿2022/08/20 07:03

実現したいこと

文字列を比較して差分を抽出したく、参考になるサイトを検索して
探したのですが、比較してtest01に存在してtest02に存在しない文字列
(status == '+')、
test02に存在してtest01の存在しない文字列のパターンの2パターン
(status == '-':)を抽出したいのですが、一緒に抽出されてしまいます。

該当のソースコード

import difflib

def compare_test(test01, test02):

a = difflib.Differ() diffs = a.compare(test01, test02) result = '' for diff in diffs: status, _, character = list(diff) if status == '-': character = character elif status == '+': character_1 = character else: character="" result += character print(result)

test01 = "犬のおまわりさん"
test02 = "猫のおまわり"
compare_test(test01, test02)

結果:犬猫さん

試したこと

↓のようにstatusが+の時は変数名を変えてみたが、
-と一緒に抽出されてしまう

elif status == '+':
character_1 = character

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

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

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

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

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

can110

2022/08/20 09:33

実現したいことがいまひとつ明確ではないかと思います。 たとえば「犬のおまわりさん」と「猫さんのおまわり」の結果はどうなるでしょうか?
guest

回答2

0

ベストアンサー

compare_test() 関数でどのようなことをしたいのかよくわかりませんが、以下の部分が意図どおりにならない原因でしょう。

python

1 if status == '-': 2 character = character 3 elif status == '+': 4 character_1 = character 5 else: 6 character="" 7 result += character

この処理では、「条件に合っているときだけ、resultに文字を追加する」ということを意図していると思います。 elseの時はcharacterを空にしているのはいいでしょうが、そうなっていません。
elseのところで、characterを空白にしているのはOKで、'-'のときにcharocterにcharacterを入れているのもまあOKです。
ところが、'+'のときは、characterの値をcharacter_1に入れているだけで、characterの内容は変っていません。 これでは、'+'のときもresultに文字が入ってしまいます。
これは、characterという変数の意味が曖昧になっているのが原因です。resultに何を追加すべきかが明確にされていないからだと思います。ここの処理はたとえばこんな感じでしょうか。。

python

1 character_in = "" 2 if status == '-': 3 character_in = character 4 elif status == '+': 5 character_in = "" 6 else: 7 character_in = "" 8 result += character_in

ころで意図通りになるかはわかりません。 また、ちょっと処理的に冗長な気もしますね。
いっそこうでもいいかも

python

1 if status == '-': 2 result += character

投稿2022/08/20 09:24

TakaiY

総合スコア14345

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

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

0

set を使う場合。

python

1 2def compare_test(a, b): 3 return [*(set(a) - set(b))] 4 5if __name__ == '__main__': 6 test01 = "犬のおまわりさん" 7 test02 = "猫のおまわり" 8 only_01 = compare_test(test01, test02) 9 only_02 = compare_test(test02, test01) 10 print(only_01) 11 print(only_02)

投稿2022/08/20 07:17

編集2022/08/20 07:21
melian

総合スコア21136

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

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

tom57

2022/08/21 23:29

melianさん 回答ありがとうございます。setを使う方法もあるんですね。 勉強になりました。 melianTakaiYさん 回答ありがとうございます。 初心者の私にわかりやすく回答頂きありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問