概要
与えられたコメントを最初の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_cd
が None
でない場合(終端記号が見つかった場合)、comment_100
を location_punc_cd + 1
の位置でカットし、最終的なカットされたコメントを得ます。
ちなみに、rfind
メソッドは文字列のメソッドであり、リスト(punc_cd_values
)を引数として受け取ることはできません。そのまま渡すと以下のエラーになります。
'must be str, not QuerySet'