python で、「javaのStringUtils.abbreviate」的なこと

「長い文字列を…で省略」の話。

「javaにはcommons.langがあるんだぜ、StringUtils.abbreviateで一撃なんだぜ」と言われそうだ。そしてこれを「電池付きを謳う Python のくせにできねーんでやんの」と dis られそうだ。

つーか言語関係ないのね、このトピック。stackoverflow からのアイディアより:

 1 # -*- coding: utf-8 -*-
 2 # 以下はまぁお約束と言うか、日本語と闘うための鍋の具
 3 import codecs, sys
 4 sys.stdout = codecs.getwriter('cp932')(sys.stdout)
 5 
 6 # 以下だけが本題
 7 import re
 8 print(
 9     re.sub(
10         r'^(.{8}).*(.{8})$',
11         '\g<1>...\g<2>',
12         u"Mewを5年以上ぶりくらいに使った、そして北陸新幹線開通記念にちょっとだけ富山弁してみた"))
13 print(
14     re.sub(
15         r'^(.{8}).*(.{8})$',
16         '\g<1>...\g<2>',
17         u"Mewを5年以上け富山弁してみた"))
18 print(
19     re.sub(
20         r'^(.{8}).*(.{8})$',
21         '\g<1>...\g<2>',
22         u"Mewを5年以上富山弁してみた"))
23 print(
24     re.sub(
25         r'^(.{8}).*(.{8})$',
26         '\g<1>...\g<2>',
27         u"Mewをた"))

実行するとこうなる:

1 Mewを5年以上...け富山弁してみた
2 Mewを5年以上...け富山弁してみた
3 Mewを5年以上富山弁してみた
4 Mewをた

なんでも正規表現で済ませるのはどうかしているが、正規表現さえあればどうとでもなる、ということでもあり。「素の C/C++」と「スクリプト言語」を隔てる最重要の違いが正規表現だというのはまぁ、こういうことなのであるね。いまどきのスクリプト言語で正規表現を扱えないものなんか、ないよね。






2018-02-16、つまり3年後くらいの追記:
Python, PowerShell, Java, Ruby でネタを書いたが、ほんとに javascript でこれにご用で。

無論発想はおんなじ:

1     let report = url + ": " + xhr.responseText + " (status: " + xhr.status + ")";
2     let excerpt = report.replace(/^(.{30}).*(.{30})/, "$1...$2");
3     $("#status-bar-text").html(excerpt);

名前からわかる通り「ステータスバー的なもの」に流し込むテキストで、これが溢れると非常にみっともないことなるもんで。(無論これだけではダメで、ちゃんと全文読める UI も別途作ってる。)