Как заставить интерпретатор Python правильно обработать символы неASCII в строковых операциях?

ConcurrentLinkedHashMap трудно создать, из-за требований блокировки. LinkedHashMap с блокировкой прост, но не всегда производителен. Параллельная версия попыталась бы уменьшить объем блокировки, или разделением блокировки или идеально созданием операций CAS для создания блокировки очень дешевой. Если операции CAS когда-нибудь становятся дорогими, то так же разделение блока может быть полезным. Поскольку LRU требует записей для каждой операции доступа и использует двунаправленный связанный список, это очень хитро для реализации с чистыми операциями CAS. Я делал попытку его, но я должен продолжить становиться зрелым свой алгоритм. При поиске ConcurrentLinkedHashMap Вы будете видеть мою страницу проекта...

, Если бы ME Java не поддерживает операции CAS, которые я ожидал бы быть верным, тогда основная синхронизация - все, что можно сделать. Это, вероятно, достаточно хорошо с LHM, учитывая, что я только видел, что проблемы производительности в высоком потоке рассчитывают на серверную сторону. Так +1 к ответам выше.

100
задан Spontifixus 20 November 2013 в 08:37
поделиться

7 ответов

Python 2 использует ascii в качестве кодировка по умолчанию для исходных файлов, это означает, что вы должны указать другую кодировку в верхней части файла, чтобы использовать символы Unicode, отличные от ascii, в литералах. Python 3 использует utf-8 в качестве кодировки по умолчанию для исходных файлов, поэтому это не проблема.

См.: http://docs.python.org/tutorial/interpreter.html#source-code-encoding

Чтобы включить исходную кодировку utf-8, это должно быть в одной из двух верхних строк:

# -*- coding: utf-8 -*-

выше находится в документации, но это также работает:

# coding: utf-8

Дополнительные соображения:

  • Исходный файл также должен быть сохранен с использованием правильной кодировки в вашем текстовом редакторе.

  • В Python 2 литерал Unicode должен иметь u перед ним, как в s.replace (u "Â", u "") Но в Python 3 просто используйте кавычки. В Python 2 вы можете из __future__ import unicode_literals для получения поведения Python 3, но имейте в виду, что это влияет на весь текущий модуль.

  • s.replace (u "Â", u "") также завершится ошибкой, если s не является строкой Unicode.

  • строка. replace возвращает новую строку и не редактирует на месте, поэтому убедитесь, что вы также используете возвращаемое значение

78
ответ дан 24 November 2019 в 04:48
поделиться
def removeNonAscii(s): return "".join(filter(lambda x: ord(x)<128, s))

редактировать: мой первый импульс - всегда использовать фильтр, но выражение генератора более эффективно с точки зрения памяти (и короче) ...

def removeNonAscii(s): return "".join(i for i in s if ord(i)<128)

Имейте в виду, что это гарантированно работает с кодировкой UTF-8 (потому что все байты в многобайтовом формате у символов старший бит установлен в 1).

155
ответ дан 24 November 2019 в 04:48
поделиться
>>> unicode_string = u"hello aåbäcö"
>>> unicode_string.encode("ascii", "ignore")
'hello abc'
32
ответ дан 24 November 2019 в 04:48
поделиться

Использование Regex:

import re

strip_unicode = re.compile("([^-_a-zA-Z0-9!@#%&=,/'\";:~`\$\^\*\(\)\+\[\]\.\{\}\|\?\<\>\\]+|[^\s]+)")
print strip_unicode.sub('', u'6Â 918Â 417Â 712')
6
ответ дан 24 November 2019 в 04:48
поделиться
#!/usr/bin/env python
# -*- coding: utf-8 -*-

s = u"6Â 918Â 417Â 712"
s = s.replace(u"Â", "") 
print s

Будет напечатан 6 918 417 712

3
ответ дан 24 November 2019 в 04:48
поделиться
s.replace(u'Â ', '')              # u before string is important

и сделайте свой .py файлом Unicode.

1
ответ дан 24 November 2019 в 04:48
поделиться

Это грязный прием, но он может работать.

s2 = ""
for i in s:
    if ord(i) < 128:
        s2 += i
1
ответ дан 24 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: