雅五笔输入法在Python中的实现方法
网络上的一些文本,部分会有一些不必要的空格,如果想把空格全部替换掉,使用字符串string类的replace()方法即可,如:
str = str.replace(' ','')
但如果是中英文混排的文本,如果想替换掉汉字中间的空格,而保留英文单词之间的空格,则问题的解决要复杂一些。需要用到正则表达式。
如有以下文档:
行(或段)的首尾、一些汉字之间有不必要的空格,需要替换掉。
用以下Python代码即可:
处理后的文本保存到了new.txt文档:
当然,一些有规律的乱码也可以处理。
上面有提到全部是中文的简单处理方法,也可以用一个简单的正则表达式判断文档或字符串内容是否包含“英文+空格+英文”的形式,然后用一个条件判断分别处理:
下面需要重点剖析一下上面关于正则表达式的概念及相关的一些内容:
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
1 compile()方法
向re.compile()传入一个字符串值,表示编译一个正则表达式,它将返回一个Regex 模式对象(或者就简称为Regex 对象)。
我们在Python中使用正则表达式时,re模块内部会做两件事情:
I 编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
II 用编译后的正则表达式去匹配字符串;
如果一个正则表达式要重复使用多次或一些较复杂的正则表达式,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配。编译后生成Regular Expression对象。
可以向re.compile()传入re.IGNORECASE 或re.I,作为第二个参数,让正则表达式不区分大小写:
>>> robocop = re.compile(r'robocop', re.I)
>>> robocop.search('RoboCop is part man, part machine, all cop.').group()
'RoboCop'
2 r'……'的写法
r'……'表示忽略……可中可能存在的转义字符,当做普通字符看待;
3 中括号[]
有时候你想匹配一组字符,但缩写的字符分类(\d、\w、\s 等)太宽泛。你可以用方括号[]定义自己的字符分类。
\d、\w 和\s 分别匹配数字、字母和空格。
\D、\W 和\S 分别匹配出数字、字母和空格外的所有字符。
例如,字符分类[aeiouAEIOU]将匹配所有元音字符(一个任意的元音字母),不论大小写。
Regex = re.compile(r'[aeiouAEIOU]')
也可以使用短横表示字母或数字的范围。例如,字符分类[a-zA-Z0-9]将匹配所有小写字母、大写字母和数字。
请注意,在方括号内,普通的正则表达式符号不会被解释。这意味着,你不需要前面加上倒斜杠转义.、*、?或()字符。例如,字符分类将匹配数字0 到5 和一个句点。你不需要将它写成[0-5\.],写成[0-5.]即可。
通过在字符分类的左方括号后加上一个插入字符(^),就可以得到“非字符类”。非字符类将匹配不在这个字符类中的所有字符。例如:
Regex = re.compile(r'[^aeiouAEIOU]')
[abc]匹配方括号内的任意字符(诸如a、b 或c)。
[^abc]匹配不在方括号内的任意字符。
插入字符(^)还有另外一种用法,如果用在正则表达式的最前面,表明匹配必须发生在被查找文本开始处。类似地,可以再正则表达式的末尾加上美元符号($),表示该字符串必须以这个正则表达式的模式结束。如正则表达式r'\d
