LoginSignup
0
0

【Python】終端記号を考慮して100文字までカットするコード

Posted at

概要

与えられたコメントを最初の100文字までカットし、その際に特定の終端記号(句読点や記号など)が出現する最後の位置を考慮してカットを行うコードを実装しました。

サンプルコード

DBテーブルから取得しない場合:

punctuation_mark = ''

def cut_comment(comment):
    print("send_commentの文字数", len(comment))  
    comment_100 = comment[:100]
    print("send_comment_100の文字数", len(comment_100))  
    location = comment_100.rfind(punctuation_mark)
    print("locationの位置:", location)
    comment_100 = comment_100[:location + 1]
    print("send_comment_100:", comment_100)
    return comment_100


comment = 'コメントを100文字までにカットします1。コメントを100文字までにカットします2。コメントを100文字までにカットします3。コメントを100文字までにカットします4。コメントを100文字までにカットします5。コメントを100文字までにカットします6。'
cut_comment(comment)

# 出力結果:

# send_commentの文字数 126
# send_comment_100の文字数 100
# locationの位置: 83
# send_comment_100: コメントを100文字までにカットします1。コメントを100文字までにカットします2。コメントを100文字までにカットします3。コメントを100文字までにカットします4。

.rfind() メソッドとは?

文字列内で指定された部分文字列を後ろから検索し、その最後に現れる位置(インデックス)を返すメソッド。

基本的な構文は次の通りです

string.rfind(substring)

string: 検索対象となる元の文字列。
substring: 検索したい部分文字列。

このメソッドは、指定した部分文字列が見つからない場合には -1 を返します。それ以外の場合、指定した部分文字列が最後に現れるインデックスを返します。

comment_100[:location + 1]

+1 を足しているのは、location_punc_cdが句読点文字の位置を示しており、その句読点文字を含めるためです。インデックスが0から始まるからですね。

DBテーブルから取得する場合:

DBテーブルPuncCdには、以下のような形で登録されているとします。

id  punc_cd punc
1	1	    。
2	2	    ?
3	3	    !
4	4	    .
from xxx.models import PuncCd

def cut_comment(comment):
    comment_100 = comment[:100]

    # データベースから punc_cd の値を取得して data_punc_cd_values リストを作成
    punc_cd_values = PuncCd.objects.values_list('punc', flat=True)
    # punc_cd_valuesには<QuerySet ['。', '?', '!', '.']>が入ります

    location_punc_cd = None
    for punc_value in punc_cd_values:
        location = comment_100.rfind(punc_value)
        if location != -1:  # punc_valueが見つかった場合
            if location_punc_cd is None or location > location_punc_cd:
                location_punc_cd = location

    if location_punc_cd is not None:
        comment_100 = comment_100[:location_punc_cd + 1]

    return comment_100

comment = 'コメントを100文字までにカットします1。コメントを100文字までにカットします2。コメントを100文字までにカットします3。コメントを100文字までにカットします4。コメントを100文字までにカットします5。コメントを100文字までにカットします6。'
cut_comment(comment)

上記では、繰り返しの処理により、終端記号のリスト内で最後に出現する位置を探し、それを基準にコメントをカットしています。

丁寧に説明すると、以下のことを実施しています。

まず、punc_cd_valuesリスト内の各終端記号に対して、comment_100内でのその終端記号の最後の出現位置(インデックス)を rfindメソッドを使って探します。この位置を locationとして取得します。

もし location が -1 でない(つまり、その終端記号が comment_100 内で見つかった)場合、かつ、locationの位置が既知の最後の終端記号位置 location_punc_cd より大きい場合、location を新たな location_punc_cd として更新します。これによって、最も後ろに位置する終端記号の位置が保持されます。

最後に、もし location_punc_cdNone でない場合(終端記号が見つかった場合)、comment_100location_punc_cd + 1の位置でカットし、最終的なカットされたコメントを得ます。

ちなみに、rfindメソッドは文字列のメソッドであり、リスト(punc_cd_values)を引数として受け取ることはできません。そのまま渡すと以下のエラーになります。

'must be str, not QuerySet'
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0