通过正则表达式替换删除非字母数字字符

时间:2017-01-06 18:54:16

标签: python regex python-2.7

我有这个代码,我想删除非字母数字字符。问题是它也删除了阿拉伯语单词。如何保留阿拉伯字符并仅删除非字母数字字符。

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

输出空字符串。

但我想要这个:

"سلام"

3 个答案:

答案 0 :(得分:2)

这是因为阿拉伯字符不是传统意义上的“单词”字符......

请参阅LayoutInflater

相关文字:

“\ w代表”单词字符“。它始终匹配ASCII字符[A-Za-z0-9 _]”

...

“以上三个短号也有否定版本。\ D与[^ \ d]相同,\ W是[^ \ w]的缩写,\ S相当于[^ \ s]。”< / p>

# -*- coding: utf-8 -*-
import re
hello = u"سلام .@#(*&"
print re.sub(ur'[^\w^\u0600-\u06FF]', '', hello)

答案 1 :(得分:2)

编辑:我意识到有一个更简单的答案。只需打开unicode模式。

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

在Python 3中,由于Python 3处理unicode字符串的方式,这个标志是不必要的。有关详细信息,请参阅https://stackoverflow.com/a/393915/691859

(老回答)

您需要定义实际要保留的角色类。既然你正在处理unicode字符,你将需要构建一个包含你的字符的字符类......我不是unicode专家,我也读不懂阿拉伯语,但是let's go with what wikipedia says is the Arabic unicode block是U-0600到U形叙利亚文。

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

秘诀就是让你的正则表达式本身也是一个unicode字符串,这样你就可以放入阿拉伯语unicode块的unicode转义序列。

正如其他人所指出的那样,\W意味着[^\w]封装了阿拉伯语块。如果您想要除阿拉伯语和拉丁字母数字字符以外的所有内容,则可以使用[^\w\u0600-\u06FF]

  • []表示字符类。
  • ^表示除了您将要在课堂上播放的内容之外的所有内容。
  • \w表示A-Z,a-z,_和0-9。
  • \u0600是阿拉伯语unicode块中第一个字符的unicode转义。
  • -表示“一切从”到
  • \u06FF是阿拉伯语unicode块中最后一个字符的unicode转义。

答案 2 :(得分:2)

在找到这个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
}