我有這段代碼,我想刪除非字母數字字符。問題是它也刪除了阿拉伯語單詞。我如何保留阿拉伯字符並刪除非字母數字字符。通過正則表達式替換刪除非字母數字字符
# -*- 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