python进阶之文本字符串、Unicode编码、正则表达式

文本字符串
■.字符:是各种文字和符号的总称,包括个国家文字、标点符号、图形符号、数字等。
■.字符集:是多个字符的集合,字符集的种类较多,每个字符集包含的字符个数也不同,常见的字符集名称包括:ASCII字符集、GB2312字符集、BIG5字符集 、GB18030字符集、Unicode字符集等。
■.字符编码:也称字集码,是把字符集中的字符编码为指定集合中的某一对象(例如:比特模式、自然数序列、8位组或电脉冲)以便在计算机中存储和通过通信网络传递文本。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其他符号进行编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式进行存储。

简单地说,编码就是使用一个计算机能够识别的数字来代表一个文字,计算机在处理的时候不关心具体的文字,只关心文字的编码,这样就可以使用计算的方式来处理文字了。

ASCII字符集和编码:
在所有的字符集中,ASCII字符集是早期计算机操作系统中的主要字符集。其主要包括控制字符(回车键、退格、 换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
ASCII字符集最大的缺点就是只能显示标准的26个拉丁字母、阿拉伯数字和英式标点,当需要显示外来语时就无能为力了,另外也不能显示东方象形文字。所以当今主流的操作系统都开始使用Unicode编码了

Unicode 字符集及UTF-8编码
其实,在Unicode编码流行起来之前,我国就定制了国标编码GB2312,我国的台湾、香港和澳门所使用的Bigs繁体中文编码,以及日本的Shift JIS编码等。为了使原来只支持英文的计算机也支持本国的语言,这些国家和地区都做出了贡献。不过随着多国语言同屏显示的需求产生,一种统一的、通用的可以同时编码绝大多数语言的编码被发明了出来,这就是Unicode编码。
UTF-8编码就是针对Unicode字符集的一种字符编码,UTF-8可以根据不同的符号自动选择编码的长短,以提高Unicode的编码效率。而且UTF-8是ASCII的一个超集,一个纯ASCII字符串,也是一个合法的UTF-8字符串。如今,不只是有UTF-8,还有UTF-16、UTF-32。它们同样都是针对Unicode字符集进行编码,不过各有各的特点,到今天我们几乎已经只使用UTF-8编码了,所以大家也不用关心其他的编码了。不过,对于python,在当初发布的年代还没有Unicode编码,所以Pyhon 2.7到现在为止的默认编码仍然是ASCII,有时候我们会发现有的程序开头加上了

# -*- coding: utf-8 -*-

这个代码会告诉编译器,这个文件需要用UTF-8的编码方式进行解码,这样才可以在程序中使用非ASCII字符。

正则表达式:
计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。简单的讲,正则表达式被用来进行文本的匹配。

下面我们直接上代码,代码的功能是在一段字符串(key)中匹配出“python”字符串。

import re                           #引入相应的库

key = r"javapythonhtmcssupy"         #待匹配文本
p1 = r"python"                      #我们的正则表达式
pattern1 = re.compile(p1)           #对我们想要匹配的字符串进行处理(编译)
matcher1 = re.search(pattern1,key)  #用search()方法进行查询
print(matcher1.group(0))            #打印出已经匹配好的字符串

在这里插入图片描述
提起正则表达式很多同行可能会想到前端的匹配网址或者在代码中匹配一些特定内容的匹配机制,我们这里介绍有关网址的匹配。假设有这么一个网址(随手瞎写的),我们匹配他的@符号之后,句号(“.”)之前的内容。代码如下

import re

key = r"www.chuxiuhong@sda.edu1.cn"  #待匹配字符串(随手编的,不用瞎猜了)
p1 = r"@.+\."                   #匹配到@后面一直到“.”之间的内容,这里是edu1
pattern1 = re.compile(p1)
print(pattern1.findall(key))

匹配结果如下:

['@sda.edu1.']

细心的同学可能会发现我在匹配的语句中使用了 “+” 。这是因为正则表达式默认是“贪婪”的,“+”代表是字符重复一次或多次。但是并没有细说这个多次到底是多少次。所以它会尽可能“贪婪”地多给我们匹配字符,在这个例子里也就是匹配到最后一个“.”。

那么我们如何去解决这个问题呢?答案就是在”+“之后加上一个”?“即可

import re

key = r"www.chuxiuhong@sda.edu1.cn"  #待匹配字符串(随手编的,不用瞎猜了)
p1 = r"@.+?\."                   #匹配到@后面一直到“.”之间的内容,这里是edu1
pattern1 = re.compile(p1)
print(pattern1.findall(key))

结果如下:

['@sda.']

在这里插入图片描述

在正则表达式中,我们还有另一种匹配机制:学会使用re

re.match()尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None.
函数语法为:re.match(pattern, string, flags=0)
其中,pattern:匹配的正则表达式;string:要匹配的字符串;flags:标志位,用于控制正则表达式的匹配方式,如:多行匹配、是否区分大小写等。

import re

print(re.match('python', 'python zhe li shi python xue xi qu',).span())

输出结果为:

(0, 6)

re.search()扫描整个字符串并返回一个成功的匹配。函数语法:

re.search(pattern, string, flags=0)

其中的参数的功能与match()相同,pattern:匹配的正则表达式;string:要匹配的字符串;flags:标志位,用于控制正则表达式的匹配方式,如:多行匹配、是否区分大小写等。
re.match()与 re.search()的区别:
re.match()只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search()匹配整个字符串,直到找到一个匹配。

findall():在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match()和 search()是匹配一次; 而findall()则是匹配所有。
语法格式为:findall(string[, pos[, endpos]])
string为带匹配的字符串;pos:为可选参数,指定字符串的起始位置,默认为0;endpos:可选参数,指定字符串的结束位置,默认为字符串的长度。

import re

pattern = re.compile(r'\d+')  # 用(\d)查找数字
result1 = pattern.findall('runoob 123 sdefle 87')		#不加入可选参数
result2 = pattern.findall('ru1212sfspytohngoogle456', 0, 10)		#加入可选参数

print(result1)
print(result2)

结果为:

['123', '87']
['1212']

re.finditer:和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。语法规则为:

re.finditer(pattern, string, flags=0)

其中,pattern:匹配的正则表达式;string:要匹配的字符串;flags:标志位,用于控制正则表达式的匹配方式,如:多行匹配、是否区分大小写等。

import re

it = re.finditer(r"\d+", "11pythonm12123sddw43jf3")
for match in it:
    print(match.group())        #用group来获取匹配到的数字

输出结果为:

11
12123
43
3
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值