/ / Pythonを使用してASCII以外の文字を削除し、ピリオドとスペースを残すにはどうすればよいですか。 - Python、テキスト、Unicode、フィルタ、ASCII

非ASCII文字を削除するにはどうしたらいいですか? - Python、テキスト、Unicode、フィルタ、ASCII

.txtファイルで作業しています。ファイルからASCII以外の文字を含まないテキストの文字列が欲しいのですが、スペースとピリオドを残したいのです。現在は、それらも取り除きます。ここにコードがあります:

def onlyascii(char):
if ord(char) < 48 or ord(char) > 127: return ""
else: return char

def get_my_string(file_path):
f=open(file_path,"r")
data=f.read()
f.close()
filtered_data=filter(onlyascii, data)
filtered_data = filtered_data.lower()
return filtered_data

スペースとピリオドを残すようにonlyascii()を変更するにはどうすればいいですか?それほど複雑ではないと思いますが、わかりません。

回答:

回答№1の129

印刷できない文字列からすべての文字をフィルタすることができます。 string.printable、 このような:

>>> s = "somex00string. withx15 funny characters"
>>> import string
>>> printable = set(string.printable)
>>> filter(lambda x: x in printable, s)
"somestring. with funny characters"

私のマシンのstring.printableには以下が含まれています。

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
!"#$%&"()*+,-./:;<=>?@[\]^_`{|}~ tnrx0bx0c

回答№2の56

別のコーデックに変更する簡単な方法は、encode()またはdecode()を使用してください。あなたの場合、あなたはASCIIに変換して、サポートされていないすべてのシンボルを無視したいです。たとえば、スウェーデン文字のåはASCII文字ではありません。

    >>>s = u"Good bye in Swedish is Hej dxe5"
>>>s = s.encode("ascii",errors="ignore")
>>>print s
Good bye in Swedish is Hej d

編集:

Python3:str - > bytes - > str

>>>"Hej då".encode("ascii", errors="ignore").decode()
"hej d"

Python2:unicode - > str - > unicode

>>> u"hej då".encode("ascii", errors="ignore").decode()
u"hej d"

Python2:str - > unicode - > str(逆順にデコードしてエンコードする)

>>> "hej dxe5".decode("ascii", errors="ignore").encode()
"hej d"

回答№3の15

@artfulrobotによると、これはfilterやlambdaよりも速いはずです。

re.sub(r"[^x00-x7f]",r"", your-non-ascii-string)

もっと例を見る http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-single-space/20079244#20079244


回答№4の7

あなたの質問はあいまいです。最初の二つ文をまとめると、スペースと「ピリオド」はASCII以外の文字であると思われることを意味します。これは間違いです。 ord(char)<= 127のようなすべての文字はASCII文字です。例えば、あなたの関数はこれらの文字を除外します! "#$%&"()* +、 - 。/ [] {}。

戻って、少し考えてから、ASCIIという言葉は言うまでもなく、あなたが何をしようとしているのか、そしてord(char)> = 128のような文字は無視できると思うのはなぜなのかという質問です。また、Pythonのどのバージョン?入力データのエンコーディングは何ですか?

あなたのコードは入力全体を読むことに注意してください1つの文字列としてファイルを作成し、別の回答に対するあなたのコメント( "素晴らしい解決策")は、データの改行を気にしないことを意味します。

this is line 1
this is line 2

結果は "this is line 1this is line 2" ...あなたが本当に欲しいものは何ですか?

より良い解決策は次のとおりです。

  1. フィルタ関数の名前は、 onlyascii
  2. 引数が保持されるのであれば、フィルタ関数は単に真の値を返すだけでよいという認識。

    def filter_func(char):
    return char == "n" or 32 <= ord(char) <= 126
    # and later:
    filtered_data = filter(filter_func, data).lower()
    

回答№5の場合は1

印刷可能なASCII文字が必要な場合は、おそらくコードを次のように修正する必要があります。

if ord(char) < 32 or ord(char) > 126: return ""

これは、 string.printable (@jterraceからの回答)、戻り値とタブ( "t"、 "n"、 "x0b"、 "x0c"、 "r")がないことを除いて、質問の範囲に対応していません。


答え№6の場合は0

Fluent Python(Ramalho)を使って私のやり方を進めてください - 強く推奨します。 第2章に触発されたリスト内包表記

onlyascii = "".join([s for s in data if ord(s) < 127])
onlymatch = "".join([s for s in data if s in
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"])