Hướng dẫn remove weird characters from string python - xóa các ký tự lạ khỏi chuỗi python

Đã hỏi 10 năm, 10 tháng trước 10 years, 10 months ago

Đã xem 225k lần 225k times

Tôi đang làm việc với một tệp .txt. Tôi muốn một chuỗi văn bản từ tệp không có ký tự không phải ASCII. Tuy nhiên, tôi muốn để lại không gian và thời gian. Hiện tại, tôi cũng đang tước những thứ đó. Đây là mã:

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

Làm thế nào tôi nên sửa đổi Onlyascii [] để rời khỏi không gian và thời gian? Tôi tưởng tượng nó không quá phức tạp nhưng tôi không thể tìm ra nó.

Martineau

Huy hiệu vàng 116K2525 gold badges161 silver badges288 bronze badges

Hỏi ngày 31 tháng 12 năm 2011 lúc 18:23Dec 31, 2011 at 18:23

2

Bạn có thể lọc tất cả các ký tự từ chuỗi không thể in bằng String.Printable, như thế này:

>>> s = "some\x00string. with\x15 funny characters"
>>> import string
>>> printable = set[string.printable]
>>> filter[lambda x: x in printable, s]
'somestring. with funny characters'

String.printable trên máy của tôi chứa:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
!"#$%&\'[]*+,-./:;?@[\\]^_`{|}~ \t\n\r\x0b\x0c

Chỉnh sửa: Trên Python 3, bộ lọc sẽ trả về một điều khác. Cách chính xác để có được một chuỗi trở lại sẽ là:

''.join[filter[lambda x: x in printable, s]]

Đã trả lời ngày 31 tháng 12 năm 2011 lúc 18:29Dec 31, 2011 at 18:29

Jterracejterracejterrace

62,8K22 Huy hiệu vàng155 Huy hiệu bạc196 Huy hiệu đồng22 gold badges155 silver badges196 bronze badges

23

Một cách dễ dàng để thay đổi thành một codec khác, là bằng cách sử dụng mã hóa [] hoặc giải mã []. Trong trường hợp của bạn, bạn muốn chuyển đổi sang ASCII và bỏ qua tất cả các biểu tượng không được hỗ trợ. Ví dụ, chữ Thụy Điển không phải là một ký tự ASCII:

    >>>s = u'Good bye in Swedish is Hej d\xe5'
    >>>s = s.encode['ascii',errors='ignore']
    >>>print s
    Good bye in Swedish is Hej d

Edit:

Python3: str -> byte -> 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 [giải mã và mã hóa theo thứ tự ngược lại]

>>> "hej d\xe5".decode["ascii", errors="ignore"].encode[]
'hej d'

Đã trả lời ngày 25 tháng 8 năm 2013 lúc 15:50Aug 25, 2013 at 15:50

ZweedeendzweedeendZweedeend

2.4552 Huy hiệu vàng16 Huy hiệu bạc19 Huy hiệu đồng2 gold badges16 silver badges19 bronze badges

4

Theo @artfulrobot, điều này sẽ nhanh hơn Filter và Lambda:

import re
re.sub[r'[^\x00-\x7f]',r'', your-non-ascii-string] 

Xem thêm các ví dụ ở đây thay thế các ký tự không phải ASCII bằng một khoảng trống

Đã trả lời ngày 23 tháng 2 năm 2016 lúc 14:14Feb 23, 2016 at 14:14

Noam Manosnoam ManosNoam Manos

Huy hiệu vàng 13.8k379 Huy hiệu bạc83 Huy hiệu đồng3 gold badges79 silver badges83 bronze badges

1

Bạn có thể sử dụng mã sau để xóa các chữ cái không phải tiếng Anh:

import re
str = "123456790 ABC#%? .[朱惠英]"
result = re.sub[r'[^\x00-\x7f]',r'', str]
print[result]

Điều này sẽ trở lại

123456790 ABC#%? . []

Đã trả lời ngày 30 tháng 7 năm 2019 lúc 22:27Jul 30, 2019 at 22:27

Noha Elprincenoha ElprinceNoha Elprince

1.9241 Huy hiệu vàng15 Huy hiệu bạc10 Huy hiệu đồng1 gold badge15 silver badges10 bronze badges

1

Câu hỏi của bạn là mơ hồ; Hai câu đầu tiên được thực hiện với nhau ngụ ý rằng bạn tin rằng không gian và "giai đoạn" là các ký tự không phải là ASCII. Điều này là không đúng. Tất cả các ký tự sao đó là ord [char]

Xin hãy lùi lại, suy nghĩ một chút và chỉnh sửa câu hỏi của bạn để cho chúng tôi biết bạn đang cố gắng làm gì, mà không đề cập đến từ ASCII và tại sao bạn nghĩ rằng chars sao cho ord [char]> = 128 không thể tin được. Ngoài ra: phiên bản nào của Python? Mã hóa dữ liệu đầu vào của bạn là gì?

Xin lưu ý rằng mã của bạn đọc toàn bộ tệp đầu vào dưới dạng một chuỗi duy nhất và nhận xét của bạn ["giải pháp tuyệt vời"] cho một câu trả lời khác ngụ ý rằng bạn không quan tâm đến Newlines trong dữ liệu của mình. Nếu tệp của bạn chứa hai dòng như thế này:

>>> s = "some\x00string. with\x15 funny characters"
>>> import string
>>> printable = set[string.printable]
>>> filter[lambda x: x in printable, s]
'somestring. with funny characters'
0

Kết quả sẽ là

>>> s = "some\x00string. with\x15 funny characters"
>>> import string
>>> printable = set[string.printable]
>>> filter[lambda x: x in printable, s]
'somestring. with funny characters'
4 ... đó có phải là những gì bạn thực sự muốn?

Một giải pháp lớn hơn sẽ bao gồm:

  1. Tên tốt hơn cho chức năng bộ lọc so với
    >>> s = "some\x00string. with\x15 funny characters"
    >>> import string
    >>> printable = set[string.printable]
    >>> filter[lambda x: x in printable, s]
    'somestring. with funny characters'
    
    5
  2. nhận ra rằng một hàm bộ lọc chỉ cần trả về giá trị sự thật nếu đối số được giữ lại:

    >>> s = "some\x00string. with\x15 funny characters"
    >>> import string
    >>> printable = set[string.printable]
    >>> filter[lambda x: x in printable, s]
    'somestring. with funny characters'
    
    1

Paul

9.85411 huy hiệu vàng48 Huy hiệu bạc80 Huy hiệu đồng11 gold badges48 silver badges80 bronze badges

Đã trả lời ngày 31 tháng 12 năm 2011 lúc 22:02Dec 31, 2011 at 22:02

John Machinjohn MachinJohn Machin

79,8K11 Huy hiệu vàng138 Huy hiệu bạc185 Huy hiệu đồng11 gold badges138 silver badges185 bronze badges

1

Làm việc theo cách của tôi thông qua Python trôi chảy [Ramalho] - Rất khuyến khích. Danh sách hiểu biết một-ish-liners lấy cảm hứng từ Chương 2:

>>> s = "some\x00string. with\x15 funny characters"
>>> import string
>>> printable = set[string.printable]
>>> filter[lambda x: x in printable, s]
'somestring. with funny characters'
2

Đã trả lời ngày 14 tháng 9 năm 2017 lúc 18:27Sep 14, 2017 at 18:27

1

Nếu bạn muốn các ký tự ASCII có thể in, bạn có thể sẽ sửa mã của mình thành:

>>> s = "some\x00string. with\x15 funny characters"
>>> import string
>>> printable = set[string.printable]
>>> filter[lambda x: x in printable, s]
'somestring. with funny characters'
3

Điều này tương đương, với

>>> s = "some\x00string. with\x15 funny characters"
>>> import string
>>> printable = set[string.printable]
>>> filter[lambda x: x in printable, s]
'somestring. with funny characters'
6 [câu trả lời từ @jterrace], ngoại trừ việc không có lợi nhuận và tab ['\ t', '\ n', '\ x0b', '\ x0c' và '\ r'] nhưng không tương ứng đến phạm vi trên câu hỏi của bạn

Đã trả lời ngày 31 tháng 12 năm 2011 lúc 18:50Dec 31, 2011 at 18:50

Joaquinjoaquinjoaquin

80.1K28 Huy hiệu vàng137 Huy hiệu bạc151 Huy hiệu đồng28 gold badges137 silver badges151 bronze badges

5

Bài Viết Liên Quan

Chủ Đề