[解決済み] Python で文字列から印刷不可能な文字を除去する
2022-02-10 01:27:53
質問
を実行しています。
$s =~ s/[^[:print:]]//g;
をPerlで実行すると、非活性化文字が取り除かれます。
PythonにはPOSIXの正規表現クラスがないので、[:print:]と書いても思い通りにならないんです。Pythonでは、文字が印刷可能かどうかを検出する方法を知りません。
あなたならどうする?
EDIT: Unicode文字もサポートする必要があります。文字列.printableの方法は、喜んでそれらを出力から除去します。 curses.ascii.isprintはどんなUnicode文字に対してもfalseを返します。
解決方法は?
Pythonでは文字列の反復処理は残念ながらかなり遅いです。この種のことは正規表現が一桁以上速いです。文字クラスは自分で作ればいいだけです。その ユニコード・データ モジュールはこのために非常に有用で、特に unicodedata.category() という関数があります。参照 ユニコード文字データベース は、カテゴリの説明です。
import unicodedata, re, itertools, sys
all_chars = (chr(i) for i in range(sys.maxunicode))
categories = {'Cc'}
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) in categories)
# or equivalently and much more efficiently
control_chars = ''.join(map(chr, itertools.chain(range(0x00,0x20), range(0x7f,0xa0))))
control_char_re = re.compile('[%s]' % re.escape(control_chars))
def remove_control_chars(s):
return control_char_re.sub('', s)
Python2用
import unicodedata, re, sys
all_chars = (unichr(i) for i in xrange(sys.maxunicode))
categories = {'Cc'}
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) in categories)
# or equivalently and much more efficiently
control_chars = ''.join(map(unichr, range(0x00,0x20) + range(0x7f,0xa0)))
control_char_re = re.compile('[%s]' % re.escape(control_chars))
def remove_control_chars(s):
return control_char_re.sub('', s)
いくつかの使用例では、追加のカテゴリ(例えば、すべての 制御 グループの方が望ましいかもしれないが、処理時間が遅くなり、メモリ使用量が大幅に増加する可能性がある。1カテゴリあたりの文字数。
-
Cc
(コントロール): 65 -
Cf
(フォーマット):161 -
Cs
(サロゲート): 2048 -
Co
(専用): 137468 -
Cn
(未割り当て):836601
編集 コメントからの提案の追加。
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] Pythonで文字列を小文字にするには?
-
[解決済み] JavaScriptでランダムな文字列/文字を生成する
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] Pythonで文字列を反転させる
-
[解決済み] Pythonで整数から文字列に変換する
-
[解決済み] JavaScriptで文字列から数字以外の文字を取り除く
-
[解決済み] Pythonのunicode文字列のアクセントを除去(正規化)する最良の方法は何ですか?
-
[解決済み】Pythonで文字列から英数字以外を削除する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PyQt5はユーザーログインGUIインターフェースとログイン後のジャンプを実装しています。
-
Python入門 openを使ったファイルの読み書きの方法
-
Python LeNetネットワークの説明とpytorchでの実装
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。
-
[解決済み】文字列から句読点を除去する最適な方法
-
[解決済み】非ASCII文字を半角スペースで置換する方法