Tôi cần thay thế tất cả các ký tự không phải ASCII [\ x00- \ x7F] bằng một không gian. Tôi ngạc nhiên rằng điều này không dễ dàng ở Python, trừ khi tôi thiếu một cái gì đó. Chức năng sau đây chỉ đơn giản là loại bỏ tất cả các ký tự không phải ASCII:
def remove_non_ascii_1[text]:
return ''.join[i for i in text if ord[i]>> s='ABC马克def'
>>> import re
>>> re.sub[r'[^\x00-\x7f]',r' ',s] # Each char is a Unicode codepoint.
'ABC def'
>>> b = s.encode['utf8']
>>> re.sub[rb'[^\x00-\x7f]',rb' ',b] # Each char is a 3-byte UTF-8 sequence.
b'ABC def'
Nhưng lưu ý rằng bạn vẫn sẽ gặp sự cố nếu chuỗi của bạn chứa các ký tự Unicode bị phân tách [ví dụ: ký tự riêng biệt và kết hợp các dấu Accent]:
>>> s = 'mañana'
>>> len[s]
6
>>> import unicodedata as ud
>>> n=ud.normalize['NFD',s]
>>> n
'mañana'
>>> len[n]
7
>>> re.sub[r'[^\x00-\x7f]',r' ',s] # single codepoint
'ma ana'
>>> re.sub[r'[^\x00-\x7f]',r' ',n] # only combining mark replaced
'man ana'
Đã trả lời ngày 19 tháng 11 năm 2013 lúc 18:29Nov 19, 2013 at 18:29
Mark Tolonenmark TolonenMark Tolonen
156K24 Huy hiệu vàng163 Huy hiệu bạc237 Huy hiệu Đồng24 gold badges163 silver badges237 bronze badges
3
Nếu nhân vật thay thế có thể là '?' Thay vì một không gian, thì tôi sẽ đề xuất
re.sub[r'[^\x00-\x7F]+',' ', text]
3:"""Test the performance of different non-ASCII replacement methods."""
import re
from timeit import timeit
# 10_000 is typical in the project that I'm working on and most of the text
# is going to be non-ASCII.
text = 'Æ' * 10_000
print[timeit[
"""
result = ''.join[[c if ord[c] < 128 else '?' for c in text]]
""",
number=1000,
globals=globals[],
]]
print[timeit[
"""
result = text.encode['ascii', 'replace'].decode[]
""",
number=1000,
globals=globals[],
]]
Results:
0.7208260721400134
0.009975979187503592
Đã trả lời ngày 3 tháng 1 năm 2017 lúc 6:31Jan 3, 2017 at 6:31
AxoaxoAXO
7.4955 Huy hiệu vàng57 Huy hiệu bạc58 Huy hiệu Đồng5 gold badges57 silver badges58 bronze badges
1
Cái này thì sao?
def remove_non_ascii_2[text]:
return re.sub[r'[^\x00-\x7F]',' ', text]
0Đã trả lời ngày 20 tháng 8 năm 2016 lúc 22:35Aug 20, 2016 at 22:35
Parsecerparsecerparsecer
4.16010 Huy hiệu vàng55 Huy hiệu bạc115 Huy hiệu Đồng10 gold badges55 silver badges115 bronze badges
5
Là một cách tiếp cận bản địa và hiệu quả, bạn không cần phải sử dụng
re.sub[r'[^\x00-\x7F]+',' ', text]
4 hoặc bất kỳ vòng lặp nào trên các ký tự. Chỉ cần mã hóa với re.sub[r'[^\x00-\x7F]+',' ', text]
5 và bỏ qua các lỗi.Sau đây sẽ chỉ xóa các ký tự không phải ASCII:
def remove_non_ascii_2[text]:
return re.sub[r'[^\x00-\x7F]',' ', text]
1Bây giờ nếu bạn muốn thay thế các ký tự đã xóa, chỉ cần thực hiện như sau:
def remove_non_ascii_2[text]:
return re.sub[r'[^\x00-\x7F]',' ', text]
2Đã trả lời ngày 23 tháng 1 năm 2018 lúc 14:39Jan 23, 2018 at 14:39
MazdakmazdakMazdak
102K18 Huy hiệu vàng157 Huy hiệu bạc183 Huy hiệu đồng18 gold badges157 silver badges183 bronze badges
2
Khi chúng tôi sử dụng
re.sub[r'[^\x00-\x7F]+',' ', text]
6, nó thoát khỏi các ký tự không phải ASCII và nó không thay đổi các ký tự ASCII một cách chính xác. Vì vậy, suy nghĩ chính của tôi là, nó không thay đổi các ký tự ASCII, vì vậy tôi đang lặp lại qua chuỗi và kiểm tra xem ký tự có được thay đổi không. Nếu nó thay đổi thì thay thế nó bằng bộ thay thế, những gì bạn đưa ra. Ví dụ: '' [một không gian duy nhất] hoặc '?' [với một dấu hỏi].For example: ' '[a single space] or '?' [with a question mark].
def remove_non_ascii_2[text]:
return re.sub[r'[^\x00-\x7F]',' ', text]
3Kết quả: "H I" [với một khoảng trống giữa].
Cú pháp:
re.sub[r'[^\x00-\x7F]+',' ', text]
7 STR = Ở đây bạn sẽ cung cấp chuỗi bạn muốn làm việc. Non_ascii_Replacer = Ở đây bạn sẽ cung cấp cho bộ thay thế mà bạn muốn thay thế tất cả các ký tự không ASCII bằng.str = Here you will give the string you want to work with.
non_ascii_replacer = Here you will give the replacer which you want to replace all the non ASCII characters with.
Yunnosch
25.6K9 Huy hiệu vàng41 Huy hiệu bạc53 Huy hiệu Đồng9 gold badges41 silver badges53 bronze badges
Đã trả lời ngày 22 tháng 12 năm 2020 lúc 8:48Dec 22, 2020 at 8:48
1
Xử lý trước bằng RAKU [trước đây gọi là Perl_6]Raku [formerly known as Perl_6]
def remove_non_ascii_2[text]:
return re.sub[r'[^\x00-\x7F]',' ', text]
4Đầu vào mẫu:
def remove_non_ascii_2[text]:
return re.sub[r'[^\x00-\x7F]',' ', text]
5Đầu ra mẫu:
def remove_non_ascii_2[text]:
return re.sub[r'[^\x00-\x7F]',' ', text]
6Lưu ý, bạn có thể nhận được thông tin sâu rộng về các trận đấu bằng mã sau:
def remove_non_ascii_2[text]:
return re.sub[r'[^\x00-\x7F]',' ', text]
7Hoặc đơn giản hơn, bạn chỉ có thể hình dung các không gian trống thay thế:
def remove_non_ascii_2[text]:
return re.sub[r'[^\x00-\x7F]',' ', text]
8//docs.raku.org/language/regexes#unicode_properies //www.codesections.com/blog/raku-unicode/ //raku.org
//www.codesections.com/blog/raku-unicode/
//raku.org
Đã trả lời ngày 19 tháng 6 lúc 2:41Jun 19 at 2:41
jubilatious1jubilatious1jubilatious1
1.4156 huy hiệu bạc15 huy hiệu đồng6 silver badges15 bronze badges
1
Vấn đề của tôi là chuỗi của tôi chứa những thứ như
re.sub[r'[^\x00-\x7F]+',' ', text]
8 cho Bỉë và re.sub[r'[^\x00-\x7F]+',' ', text]
9 cho dấu hiệu €. Và tôi không muốn thay thế chúng bằng không gian. Nhưng wth là biểu tượng đúng chính nó.Giải pháp của tôi là
# python 2.x:
from unidecode import unidecode
def remove_non_ascii[text]:
return unidecode[unicode[text, encoding = "utf-8"]]
0Đã trả lời ngày 10 tháng 6 năm 2021 lúc 10:21Jun 10, 2021 at 10:21
Smoquetsmoquetsmoquet
2411 Huy hiệu bạc10 Huy hiệu đồng1 silver badge10 bronze badges
def remove_non_ascii_2[text]:
return re.sub[r'[^\x00-\x7F]',' ', text]
9Và gọi nó như thế này:
return ''.join[[i if ord[i] < 128 else ' ' for i in text]]
0Đã trả lời ngày 23 tháng 9 lúc 14:35Sep 23 at 14:35
1
Có khả năng cho một câu hỏi khác, nhưng tôi đang cung cấp phiên bản câu trả lời của @alvero [sử dụng unidecode]. Tôi muốn thực hiện một dải "thông thường" trên các chuỗi của mình, tức là đầu và cuối chuỗi của tôi cho các ký tự khoảng trắng, sau đó chỉ thay thế các ký tự khoảng trắng khác bằng không gian "thông thường", tức là.
return ''.join[[i if ord[i] < 128 else ' ' for i in text]]
1đến
return ''.join[[i if ord[i] < 128 else ' ' for i in text]]
2Thì
return ''.join[[i if ord[i] < 128 else ' ' for i in text]]
3Trước tiên chúng tôi thay thế tất cả các không gian không phải là không thể sử dụng bằng một không gian thông thường [và tham gia lại],
return ''.join[[i if ord[i] < 128 else ' ' for i in text]]
4Và sau đó chúng tôi chia nó một lần nữa, với sự chia rẽ bình thường của Python và loại bỏ từng "bit",
return ''.join[[i if ord[i] < 128 else ' ' for i in text]]
5Và cuối cùng tham gia lại những người đó trở lại, nhưng chỉ khi chuỗi vượt qua bài kiểm tra
# python 2.x:
from unidecode import unidecode
def remove_non_ascii[text]:
return unidecode[unicode[text, encoding = "utf-8"]]
1,return ''.join[[i if ord[i] < 128 else ' ' for i in text]]
6Và với điều đó,
# python 2.x:
from unidecode import unidecode
def remove_non_ascii[text]:
return unidecode[unicode[text, encoding = "utf-8"]]
2 trả về chính xác # python 2.x:
from unidecode import unidecode
def remove_non_ascii[text]:
return unidecode[unicode[text, encoding = "utf-8"]]
3.Đã trả lời ngày 8 tháng 4 năm 2019 lúc 15:03Apr 8, 2019 at 15:03
seadersseadersseaders
3.6613 huy hiệu vàng38 Huy hiệu bạc62 Huy hiệu đồng3 gold badges38 silver badges62 bronze badges
Để thay thế tất cả các ký tự không phải ASCII [\ x00- \ x7F] bằng một khoảng trống:
return ''.join[[i if ord[i] < 128 else ' ' for i in text]]
7Để thay thế tất cả các ký tự có thể nhìn thấy, hãy thử điều này:
return ''.join[[i if ord[i] < 128 else ' ' for i in text]]
8Điều này sẽ cho kết quả tương tự:
return ''.join[[i if ord[i] < 128 else ' ' for i in text]]
9Đã trả lời ngày 6 tháng 12 năm 2021 lúc 21:01Dec 6, 2021 at 21:01