python:字符串本质、正则表达式

第一部分:Python

一.字符串本质

1.字符串本质:由若干字符构成。
字符集:赋值一个编码到字符,以便在内存中表示
编码Encoding:转换字符到原始字节形式
解码Decoding:依据编码名称转换原始字节到字符的过程
注:内存中总是存储解码以后的文本,存储在硬盘或者在网络中传输的形式是原始字节。
2.编码与解码的方式:常见的字符编码方式有ASCII、utf8、latin-1等。其中ASCII存储在一个字节中,8位占用7位,共有0-127个字符;utf8为可变字节编码,根据存储的内容从一个字节到四字节不等。
注:内置函数ord()----获取字符的代码点;chr()----获取代码点对应字符:

ord('优')
Out[20]: 20248
chr(20247)
Out[21]: '众'

3.编码与解码的内置函数:
str.encode(‘编码方式’)----将特定字符编码
bytes.decode(‘编码方式’)----将字符编码解码为字符文本

#编码
s1 = '日积月累'
s1.encode('utf8')
Out[30]: b'\xe6\x97\xa5\xe7\xa7\xaf\xe6\x9c\x88\xe7\xb4\xaf'
'abcd'.encode('ASCII')
Out[31]: b'abcd'
#解码
b1 = b'\xe6\x97\xa5\xe7\xa7\xaf\xe6\x9c\x88\xe7\xb4\xaf'
b1.decode()
Out[34]: '日积月累'

注:编码和解码的默认方式(省略不写时)为utf8,b’…’----表示即为字节码。而用系统函数open()打开文件时,默认的编码方式是gbk。
4.bytes为字节类型,可采用b’…'手动声明、str.encode(‘编码方式’)转换或bytes(字符串,‘编码方式’)函数进行转换,不支持原位改变(同字符串)。
bytearrry为字节数组,支持原位改变(同列表),bytearray(字符串,‘编码方式’)创建字节数组,.decode()解码为字符串。
5.BOM处理:Byte Order Mark字节顺序标记,出现在文本文件头部,用于标识文件采用的编码格式。用open()读写文件时,encoding为’utf-8-sig’时,存储和读取不会忽略BOM,为’utf-8’时会忽略BOM。

f = open('data2.txt','r',encoding = 'utf-8')
f.read()
Out[8]: '\ufeff天天向上'
f = open('data2.txt','r',encoding = 'utf-8-sig')
f.read()
Out[10]: '天天向上'

二.正则表达式

1.概述:Regular Expression,一种文本模式,描述在搜索文本时要匹配的一个或多个字符串。用于数据验证,文本扫描、提取、替换、分割等,可用字面值或元字符表示。
2.匹配:
1)单字匹配
. ----匹配除\n以外的所有字符
\d ----匹配所有数字,等同于[0-9]
\D ----大写相当于取反,匹配所有非数字,等同于[^0-9]
\s -----所有空白字符,如\t \n \r \f \v等
\S----所有非空白字符
\w ----字母数字字符 [A-Za-z0-9]
\W ----非字母数字
2)批量备选:| ,yes|no----yes或no都可以
3)量词:
? ----0次或1次
* ----0次或多次
+ ----1次或多次
{3,5}或{3}----特定次数范围或次数
{n,}----至少n次
4)贪婪(默认)与非贪婪:
贪婪----尽量匹配最大范围结果
非贪婪----尽量匹配最小的范围结果,量词后追加?
例:<strong>.*?</strong>即为匹配<strong>与相邻的</strong>之间的任意数量任意字符。
5)边界匹配:
^----行首,$----行尾,\b----单词边界,\B非单词边界,\A----输入开头,\Z----输入结尾

三.python中的正则表达式

1.正则对象RegexObject:表现编译后的正则表达式(编译为字节码并缓存)。
首先导入re模块:import re
创建正则对象:对象名 = re.compile(‘模式’)或 re.compile(r’模式’),加r为忽略转义,模式中写原始字符串即可。
对编译对象执行操作:
\1) .findall(要查找的对象)----查找所有非重叠匹配项,返回list
\2) .match(要查找的对象,起点,终点)----仅从起始位置(默认开头)匹配,返回MatchObject
3) .search(要查找的对象,起点,终点)----从某处(默认开头)任意搜索匹配,返回MatchObject
4) .finditer(要查找的对象)----查找所有非重叠匹配项,返回包括MatchObject元素的迭代器
注:对于’abcdefg’,利用re.compile(‘b’)的模式对象,默认开头位置搜索, .match(‘abcdefg’)返回为空, .search(‘abcdefg’)返回MatchObject对象。

2.匹配对象MatchObject:表现被匹配的模式
.group()----参数为0或空时,返回整个匹配;有参数时返回特定分组匹配细节
.groups()----返回包含所有子分组的元组
.start()----返回特定分组的起始索引
.end()----返回特定分组的终止索引
.span()----返回特定分组的起止索引
.groupdict()----以字典表形式返回分组名和结果

import re
text = 'Tom is 10 years old.Ben is 23 years old.'
pattern = re.compile(r'(\d+).*?(\d+)')
pattern.findall(text)
Out[5]: [('10', '23')]
m = pattern.search(text)
m
Out[7]: <re.Match object; span=(7, 29), match='10 years old.Ben is 23'>
m.group()
Out[8]: '10 years old.Ben is 23'
m.group(1)
Out[9]: '10'
m.start(2)
Out[10]: 27
m.end(2)
Out[11]: 29

注:在创建正则对象时,可对模式进行分组,如(\d+).*?(\d+)为两个数字即其之间的内容,'Tom is 10 years old.Ben is 23 years old.‘的匹配结果为’10 years old.Ben is 23’。

3.Group()编组
1)从匹配模式中提取信息:

re.compile(r'(\d+).*?(\d+)')

(\d+)表示一个编组,内容为任意长度的数字。
2)创建子正则,从而利用量词:

import re
re.search(r'(ac)+b','zacacb')
Out[13]: <re.Match object; span=(1, 6), match='acacb'>

r’(ac)+b’----表示任意数量的ac加上b为正则对象。
3)限制备选项范围:

re.search(r'Cent(er|re)','Center')
Out[14]: <re.Match object; span=(0, 6), match='Center'>
re.search(r'Cent(er|re)','Centre')
Out[15]: <re.Match object; span=(0, 6), match='Centre'>

r’Cent(er|re)’----正则对象中存在批量备选,即er或re都可以。
4)声明:(模式)或者(?P<name>模式)
5)引用:匹配对象内----m.group(‘name’),模式内----(?P=name),表现内----\g<name>。

text = 'Tom:98'
pattern = re.compile(r'(?P<name>\w+):(?P<score>\d+)')
pattern.search(text)
Out[18]: <re.Match object; span=(0, 6), match='Tom:98'>

4.字符串操作应用:
1).split(字符串,拆分最大数量):

text = 'a\nb\nc\nd'
re.split(r'\n',text)
Out[40]: ['a', 'b', 'c', 'd']
re.split(r'\n',text,2)
Out[41]: ['a', 'b', 'c\nd']
pattern = re.compile('\n')
pattern.split(text)
Out[43]: ['a', 'b', 'c', 'd']

2).sub(要替换的模式,替换成的模式,目标字符串):

import re
text = '*abc*'
re.sub(r'\*(?P<html>.*?)\*','<strong>\g<html></strong>',text)
Out[6]: '<strong>abc</strong>'

ords = 'ord000\nord001\nord002'
re.sub(r'(?P<alp>[a-z]+)(?P<num>\d+)','\g<num>-\g<alp>',ords)
Out[49]: '000-ord\n001-ord\n002-ord'

3).subn----替换并返回替换数量。

5.编译标记:改变正则的默认行为
re.I----忽略大小写
re.M----匹配多行
re.S----指定’.'匹配所有字符,包括\n

6.模块级别操作:
re.purge()----清理正则缓存(即已经编译的正则对象)
re.escape()----逃逸字符,如^、$本来表示行首和行尾,使用逃逸字符后,其仅代表^和$这个符号

re.findall(re.escape('^'),'^python^')
Out[53]: ['^', '^']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值