我有这段代码,我想删除非字母数字字符。问题是它也删除了阿拉伯语单词。我如何保留阿拉伯字符并删除非字母数字字符。通过正则表达式替换删除非字母数字字符
# -*- coding: utf-8 -*-
import re
hello = u"سلام [email protected]#(*&"
print re.sub(r'\W+', '', hello)
它输出空字符串。
但我想这一点:
"سلام"
我有这段代码,我想删除非字母数字字符。问题是它也删除了阿拉伯语单词。我如何保留阿拉伯字符并删除非字母数字字符。通过正则表达式替换删除非字母数字字符
# -*- coding: utf-8 -*-
import re
hello = u"سلام [email protected]#(*&"
print re.sub(r'\W+', '', hello)
它输出空字符串。
但我想这一点:
"سلام"
编辑的当量:我意识到有一个简单的答案。只要打开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-06FF。
>>> re.sub(ur'[^\u0600-\u06FF]', '', hello)
u'\u0633\u0644\u0627\u0645'
的秘诀就是让你的正则表达式本身也是一个unicode字符串,所以你可以把在Unicode转义序列为阿拉伯语的Unicode块。
正如其他人指出的,\W
意味着它封装阿拉伯语块。如果你想要的只是阿拉伯文和拉丁文字母数字字符,你可以使用[^\w\u0600-\u06FF]
。
[]
表示字符类。^
的意思是一切,但你要在课堂上。\w
表示A-Z,a-z,_和0-9。\u0600
是阿拉伯语unicode块中第一个字符的Unicode转义符。-
意思是“一切从为”\u06FF
是在阿拉伯语的Unicode块的最后一个字符的Unicode逃逸。我认为范围是\ u0600到\ u06FF,不是? – deweyredman
@deweyredman好点,我链接到错误的文章。我正在看一个说基本阿拉伯字符的范围是U-0600到U-0650的范围,但是选择了具有完整表格的链接。我会编辑我的“旧”答案,以便它没有错。 – 2rs2ts
这是因为阿拉伯字符不是一个“字”字的传统意义上的...
看到here
相关的文字:
“\ w表示”单词字符“,它始终与ASCII字符[A-Za-z0-9_]”
...
“上述三个shorthands也有否定版本。 \ d是相同的[^ \ d] \ W是短期的[^ \ W]和\ S是[^ \ s]的“
# -*- coding: utf-8 -*-
import re
hello = u"سلام [email protected]#(*&"
print re.sub(ur'[^\w^\u0600-\u06FF]', '', hello)
谢谢你的回答我的问题是,我想删除非字母数字字符,但保留阿拉伯文字! – Cherif
你想保留所有阿拉伯字符吗?如果是这样,你需要找到你想要代表的第一个和最后一个字符,并创建一个范围 – deweyredman
'\ w'因地区而异,请参见http://pcre.org/pcre.txt – Toto
请注意'\ W +'和'\ w +'是非常不同的。 '\ w'是任何单词字符。它相当于'[A-Za-z0-9_]',而'\ W'是任何非单词字符,相当于'[^ A-Za-z0-9_]'。 “+”表示“一个或多个” –
[参考 - 这个正则表达式是什么意思?](http://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean) –
编辑你的问题,一点也不清楚。提供测试字符串,您尝试的正则表达式以及所需的最终字符串。 – MYGz