Python: можно ли сравнивать строки в юникоде по видимому результату - PullRequest
0 голосов
/ 17 апреля 2019

если у меня есть строки со смешанными арабскими и латинскими буквами, результат может быть странным.

например, строка может выглядеть следующим образом: (2) بسك ويت или как это: (2)بسك ويت

и единственным отличием является метка справа налево (которая является невидимым символом юникода U + 200F) во втором.Однако это не будет иметь никакого значения, если есть только одна метка справа налево или если их несколько.Могут также быть нормальные справа налево или встроенные справа налево (U + 200F или U + 202B)

, когда я сравниваю две строки, я знаю только, если они равны.Есть ли возможность узнать, будет ли видимый результат одинаковым, даже если строки не совпадают?

1 Ответ

0 голосов
/ 17 апреля 2019

Да, но это может быть сложно, и это зависит именно от того, какой текст у вас есть.

Модуль unicodedata предоставит вам данные. Лично я бы начал с нормализации, например с NFKC или NFC, в зависимости от ваших входов.

 s = unicodedata.normalize(form, s)

Тогда я бы отфильтровал наши ненужные символы.

 s = [c for c in s if not unicodedata.category(c).startswith('C')]

Вы можете найти Общая категория в http://www.unicode.org/reports/tr44/tr44-6.html#Property_Values. Категории, которые начинаются с C: control / Formatting . Но вам может потребоваться включить и другие пробелы, в зависимости от варианта использования. Возможно, вам также необходимо выполнить другую «нормализацию», объединяя все пробелы в один U + 0020.

Очень сложно обобщить (но при первой нормализации), потому что каждая кодовая точка Юникода может иметь некоторое семантическое значение. Поэтому вы должны проверить, что вы можете выбросить и что вы должны сохранить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...