當前位置:首頁 » 編程語言 » python非法字元

python非法字元

發布時間: 2022-09-20 04:35:43

『壹』 如何用python檢測生僻字

解決思路
首先想到的就是利用 python 的正則表達式來匹配非法字元,然後找出非法記錄。然而理想總是豐滿的,現實卻是殘酷的。在實現的過程中,才發現自己對於字元編碼、以及 python 內部字元串表示的相關知識的缺乏。在這期間,踩過了不少坑,到最後雖然還有些模糊的地方,但總算有一個總體清晰的了解。在此記錄下心得,避免以後在同一個地方跌倒。
以下的測試環境是 ArcGIS 10.3 自帶的 python 2.7.8 環境,不保證其他 python 環境也適用。
python 正則表達式
python 中的正則功能由內嵌的 re 函數庫提供,主要用到 3 個函數。re.compile() 提供可重用的正則表達式,match() 和 search() 函數返回匹配結果,兩者之間的區別在於: match() 從指定位置開始匹配,search() 會從指定位置向後搜索直到找到匹配字元串。例如下面的代碼中,match_result 從第一個字元 f 開始匹配,匹配失敗返回空值;search_result 從 f 開始向後搜索,直到找到第一個匹配的字元 a, 然後通過 group() 函數輸出匹配結果為字元 a。

12345678910

import re pattern = re.compile('[abc]')match_result = pattern.match('fabc')if match_result: print match_result.group() search_result = pattern.search('fabc')if search_result: print search_result.group()

以上的實現方式需要先編譯一個 pattern,然後再進行匹配。實際上,我們可以直接利用 re.match(pattern, string) 函數來實現相同的功能。但是直接匹配的方式沒有先編譯再匹配的方式靈活,首先是正則表達式沒辦法重用,如果大量數據進行同一模式匹配,意味著每次都需要內部編譯,造成性能損失;另外,re.match() 函數沒有 pattern.match() 功能強大,後者可以指定從哪個位置開始匹配。
編碼問題
了解 python 正則的基本功能後,剩下的事情就是找到一個合適的正則表達式來匹配生僻字和非法字元。非法字元很簡單,採用以下 pattern 就可以實現匹配:

1

pattern = re.compile(r'[~!@#$%^&* ]')

然而對於生僻字的匹配,著實難倒了我。首先是對於生僻字的定義,什麼樣的字算生僻字?經過咨詢項目經理,規定非 GB2312 的字元屬於生僻字。接下來的問題是,如何匹配 GB2312 字元?
經過查詢,GB2312 的范圍是 [\xA1-\xF7][\xA1-\xFE] ,其中漢字區的范圍是 [\xB0-\xF7][\xA1-\xFE]。因此,添加生僻字匹配後的表達式為:

1

pattern = re.compile(r'[~!@#$%^&* ]|[^\xA1-\xF7][^\xA1-\xFE]')

問題似乎是順理得當地解決了,然而我還是 too simple too naive 。由於要判斷的字元串都是從圖層文件讀取的,arcpy 貼心地將讀取的字元編碼為 unicode 格式。因此,我需要找出 GB2312 字元集在 unicode 中的編碼范圍。但現實是,GB2312 字元集在 unicode 中的分布並不是連續的,使用正則表示這個范圍必定是非常復雜的。使用正則表達式匹配生僻字的構想,似乎陷入了死胡同。
解決方案
既然提供的字元串是 unicode 格式,那麼我可不可以將其轉換為 GB2312 再進行匹配呢?實際上是不行,因為 unicode 字元集要遠大於 GB2312 字元集,因此 GB2312 => unicode 總是可以實現的,而反過來 unicode => GB2312 不一定能成功。
這突然為我提供了另外一種思路,假設一個字元串的 unicode => GB2312 轉換會失敗,那麼是不是恰恰說明了它不屬於 GB2312 字元集?所以,我使用 unicode_string.encode('GB2312') 函數嘗試轉換字元串,捕獲 UnicodeEncodeError 異常來識別生僻字。
最終的代碼如下:

1234567891011121314

import re def is_rare_name(string): pattern = re.compile(u"[~!@#$%^&* ]") match = pattern.search(string) if match: return True try: string.encode("gb2312") except UnicodeEncodeError: return True return False

總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

『貳』 python re模塊如何判斷字元串中包含某些特定字元如文件名中不能包含'','/'等字元,如何檢查

方法有很多,例如使用首尾位置標記^$+非法字元集[^]實現:

regex=r'^[^\/:*?"<>|]+$'#不能為空,不能含有/:*?"<>|等字元
tests=['abc_def',
'abc.def',
'abc/def',
'?"',
'']
matches=[iforiintestsifre.match(regex,i)]
print(matches)

還可以通過負向零寬斷言(?!)等方式實現。

『叄』 python 運行時invalid start byte 錯誤

python 運行時invalid start byte 錯誤是設置錯誤造成的,解決方法為:

1、代碼敲定完成之後,我們點擊pycharm菜單欄當中的運行,或者按下快捷鍵shift+F10,即可運行。

『肆』 python 運行不過去SyntaxError: Non-ASCII character '\xc2' in file 總說我藍色標注的一行有問題

其實有個更簡單的辦法。
打開「我的電腦」,在你的項目文件夾下找到出現該錯誤的文件。用EmEditor等編輯器打開,看看保存的編碼是不是UTF-8,如果不是,用UTF-8保存一下就行了。
另外,如果你是用的編程工具是PYCharm的話,打開文件——默認設置——編輯器——文件編碼,檢查一下Project Encode和文件默認編碼是不是UTF-8格式,如果不是的話,請改成UTF-8。
如此一來,再配合其他答主的方法,問題就解決了。

『伍』 python中,輸入簡單的非法語句為什麼顯示不一致呢

因為解釋器先檢查語法,再檢查語義


這兩行代碼里,$=是語法錯誤,python沒有這個語法

SyntaxError: invalid syntax 就是告訴你, 語法錯誤


但是%=是存在的,是可以使用的正規語法

比如x=5;x%=2

x會變成1


但是你的my不是一個先定義過的變數,不能使用%=

NameError: name 'my' is not defined 是說'my'沒有被定義過, python無法在環境中找到'my'這個名字


所有的X=(+=,-=.*=....)都需要用在先定義過的變數上

>>>x="abc%sdef"
>>>x%="xyz"
>>>x
'abcxyzdef'

最後, 如果你在不支持某個運算符的變數上調用那個運算符

>>>classA:
pass

>>>a=A()
>>>a%=1

會得到如下,
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <mole>
a %= 1
TypeError: unsupported operand type(s) for %=: 'instance' and 'int'


如何給你自己的類正確定義運算符?

>>>classA(object):
i=1
def__add__(self,x):
y=A()
y.i=self.i+x.i
returny


>>>a=A()
>>>b=A()
>>>a+b
<__main__.Aobjectat0x0000000002D98F98>
>>>x=a+b
>>>x.i
2
>>>x+=A()
>>>x
<__main__.Aobjectat0x0000000002DA0080>
>>>x.i
3

『陸』 python返回的i源碼有非法字元許序列怎麼解決

您好,python並不支持i++這種整數自增的語法。如果您想要達到類似的效果,您可以使用如下語句。首先,如果您想要使整數i,每次增加1,則有語句 i += 1;同理,整數 i 每次增加2,則有語句 i += 2,以此類推。如果您想要使整數i,每次減少1,則有語句 i -= 1,;同理,整數 i 每次減少2,則有語句 i -= 2,以此類推。

『柒』 新手學習python版本2.7運行代碼錯誤

這個問題是非法字元或者空格數沒對齊引起的,我看到的呢,在倒數第二行,times = times -1 這里的空格沒對齊,這個是會影響程序不能執行的。
還有不影響執行但影響執行效果的一行,print("再試一次吧:") 這里前面應該要多空一個Tab鍵的位置。不然上面的 if times > 0:就沒啥意義了。

『捌』 python如何創建一個含非法字元(比如末尾有兩個小數點)的文件夾並設置為隱藏屬性

Python2.7.2(default,Jun12

32

Type"help","right","cre

>>>importos

>>>os.mkdir('e:\1..\')

>>>

『玖』 python中x=5,y=5,z=5合法嗎

是不允許的。
True真值下列值被認為是假的,它們在應用於布爾運算符時將會直接作為假值NoneFalse0,或任何等於零的數值。
python合法標識符要求是:1、不能以數字開頭,2、不能包含非法字元,3、數字不能作為標識符,4、不能包含空格,5、不能包含運算符。

『拾』 python學習之如何檢測非法字元

#!/usr/bin/python

# -*- coding:utf8 -*-

import binascii

import sys

import os

#定義文件,並檢測多個文件

FILE_PATH = '/Users/wj6/TH'+『001』

#把文件不同的部分做一個字典,方便檢測多個文件,減少重復代碼。

m = {

'a':{'file_name':'_a.txt'}

'b':{'file_name':'_b.txt'}

}

#遍歷文件

for file_info in m:

fd = open(FILE_PATH + pid[file_info][file_name])

file_b = fd.read()

fd.close()

#做一個標記默認為0

#binascii.b2a_hex()函數換成ascii形式

#程序首先運行else段,遇到回車標記改為1,運行if語句,進行判斷是否回車換行在一起。

flag=0

for s in file_b:

asc = binascii.b2a_hex(s)

if flag==1:

if asc=='0a'

flag=0

else:

print "error,only 0d",pid[file_info][file_name]

break;

else:

if asc == '0a':

print "error,only 0a",pid[file_info][file_name]

break

if asc=='20':

print "error,only 20",pid[file_info]['file_name']

break

if asc=='22':

print "error,only 22",pid[file_info]['file_name']

break

if asc=='0d':

flag=1

熱點內容
vc60非靜態編譯 發布:2025-01-11 10:51:32 瀏覽:613
電腦上怎麼解壓縮文件 發布:2025-01-11 10:51:31 瀏覽:782
槍戰王者如何用賬號密碼登錄 發布:2025-01-11 10:30:56 瀏覽:936
mysql在linux下安裝 發布:2025-01-11 10:30:49 瀏覽:843
資料庫copy 發布:2025-01-11 10:26:06 瀏覽:533
unity清理緩存 發布:2025-01-11 10:25:23 瀏覽:466
優酷視頻雙擊上傳 發布:2025-01-11 10:24:41 瀏覽:963
存儲臍帶胎兒幹細胞 發布:2025-01-11 10:18:36 瀏覽:330
實簡ftp軟體怎麼改伺服器文件 發布:2025-01-11 10:09:39 瀏覽:555
qb充值源碼 發布:2025-01-11 10:00:21 瀏覽:27