У меня есть этот код, и я хочу удалить не алфавитно-цифровые символы. Проблема в том, что он удаляет и арабские слова. Как я могу сохранить арабские символы и удалить только не буквенно-цифровые символы.

# -*- coding: utf-8 -*-
import re
hello = u"سلام .@#(*&"
print re.sub(r'\W+', '', hello)

Он выводит пустую строку.

Но я хочу этого:

"سلام"
0
Charif DZ 6 Янв 2017 в 21:54

3 ответа

Лучший ответ

Изменить: я понял, что есть более простой ответ. Просто включите режим Unicode.

re.sub(r'\W', '', hello, flags=re.UNICODE)

В Python 3 этот флаг не нужен из-за того, как Python 3 обрабатывает строки Unicode. См. https://stackoverflow.com/a/393915/691859 для получения дополнительной информации.


(Старый ответ)

Вам нужно определить класс персонажа, который вы на самом деле хотите сохранить. Поскольку вы имеете дело с символами Юникода, вам нужно создать класс символов, который включает в себя ваши символы ... Я не эксперт по Юникоду, и я также не могу читать по-арабски, но давайте рассмотрим то, что в Википедии называется арабский блок Юникода, который является U-0600-U-06FF.

>>> re.sub(ur'[^\u0600-\u06FF]', '', hello)
u'\u0633\u0644\u0627\u0645'

Секретный соус состоит в том, чтобы сделать ваше регулярное выражение также строкой Юникода, чтобы вы могли вставить escape-последовательности Юникода для блока арабского Юникода.

Как указывали другие, \W означает [^\w], который инкапсулирует арабский блок. Если вы хотите все, кроме арабских и латинских буквенно-цифровых символов, вы можете использовать [^\w\u0600-\u06FF].

  • [] означает класс символов.
  • ^ означает все, кроме того, что вы собираетесь поместить в класс.
  • \w означает A-Z, a-z, _ и 0-9.
  • \u0600 - экранирование Юникода для первого символа в арабском блоке Юникода.
  • - означает «все от до»
  • \u06FF - экранирование Юникода для последнего символа в арабском блоке Юникода.
2
Community 23 Май 2017 в 12:01

Это происходит потому, что арабский символ не является словом «слово» в традиционном смысле ...

Смотрите здесь

Соответствующий текст:

«\ w означает« символ слова ». Он всегда соответствует символам ASCII [A-Za-z0-9_]»

...

«Вышеупомянутые три сокращения также имеют отрицательные версии. \ D - это то же самое, что [^ \ d], \ W - сокращение для [^ \ w], а \ S - эквивалент [^ \ s]».

# -*- coding: utf-8 -*-
import re
hello = u"سلام .@#(*&"
print re.sub(ur'[^\w^\u0600-\u06FF]', '', hello)
2
deweyredman 6 Янв 2017 в 20:09

У меня была та же проблема, пока я не нашел это решение JQuery,

function slugify(text)
{
  return text.toString().toLowerCase()
    .replace(/[^\w^\u0600-\u06FF]+/g, '-')  // Remove all non-word chars and replace spaced with "-" respects arabic characters
    .replace(/\-\-+/g, '-')         // Replace multiple - with single -
    .replace(/^-+/, '')             // Trim - from start of text
    .replace(/-+$/, '');            // Trim - from end of text
}

Я хотел сделать генератор слагов, который уважает арабские символы, идея состоит в том, чтобы идентифицировать арабские символы в регулярном выражении, так что это конечный результат, надеюсь, он поможет:

// slug creation
$(document).ready(function(){
  $("#name").change(function(){
  $postTitle = document.getElementById("name").value;
  $slugTitle = slugify($postTitle);
  document.getElementById("slug").value = $slugTitle;
  });
});


function slugify(text)
{
  return text.toString().toLowerCase()
    .replace(/[^\w^\u0600-\u06FF]+/g, '-')  // Remove all non-word chars and replace spaced with "-" respects arabic characters
    .replace(/\-\-+/g, '-')         // Replace multiple - with single -
    .replace(/^-+/, '')             // Trim - from start of text
    .replace(/-+$/, '');            // Trim - from end of text
}
2
Ahmed Osama 26 Апр 2019 в 17:31