当前位置:首页 » 编程语言 » 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

热点内容
用什么dns服务器地址快 发布:2025-05-15 04:52:59 浏览:26
手机端so反编译 发布:2025-05-15 04:50:55 浏览:610
linuxlamp安装 发布:2025-05-15 04:50:45 浏览:578
sqlplus缓存区怎么设置 发布:2025-05-15 04:50:44 浏览:858
shell脚本环境变量 发布:2025-05-15 04:45:18 浏览:693
安卓nba2k18什么时候出 发布:2025-05-15 04:38:42 浏览:393
王者安卓转苹果为什么显示失败 发布:2025-05-15 04:35:49 浏览:18
手机优酷缓存视频格式 发布:2025-05-15 04:13:45 浏览:210
公益电影分镜头脚本插画 发布:2025-05-15 04:08:37 浏览:961
数据压缩编码 发布:2025-05-15 03:58:44 浏览:726