Python学习笔记三(字符串及正则表达式)

1 字符串常用操作

1.1 拼接字符串

使用“+”号运算符拼接

new_str = str_1 + str_2
#字符串不能与其他数据类型进行拼接,如需拼接需要转化

str()函数语法

new_str = str_1 + str(int_1)  # int_1为数值型

1.2 计算字符串的长度

UTF-8:一个汉字占3个字节,其他一个占一个字节

len(str_name.encode())

GBK:一个汉字占2个字节,其他一个占一个字节

len(str_name.encode(“gbk”))

len()函数:计算实际多少字符,不以编码区分

len(str_name)

1.3 截取字符串

字符串也属于序列,通过切片方法实现

str_name[start:end:step]  #与列表切片一致都是通过索引

如果索引不存在会报错,使用try…except语句捕获异常

try:
	程序体
except IndexError:
	pass

1.4 分割、合并字符串

分割字符串是把字符串分割为列表,合并字符串是把列表合并为字符串

split()函数实现字符串分割

list_name = str_name.split(sep,maxsplit)
#sep:指定分割符,如果不指定则默认空字符(空格,换行\n,制表\t)进行分割
#maxsplit:指定分割次数,存在maxsplit时sep必须存在

join()函数实现列表转字符

str_name = string.join(list_name)
#string:指定合并时的分割符,该分割符会写入字符串

1.5 检索字符串

count()
检索指定字符在另一个字符串中出现的次数,如果不存在则返回0
语法:

str_name.count(character[,start[,end]])
#str_name:被检索的字符串
#character:需要检索的字符
#start:可选参数,起始位置的索引
#end:可选参数,结束位置的索引
例:
str_name = "qwertyuiop"
renumber = str_name.count("q")
print(renumber)

find()
检索字符串中是否包含指定的字符,存在则返回索引位置,不存在则返回-1
语法:

str_name.find(character[,start[,end]])

index()
与find()类似,但字符不存在时会报错
语法:

str_name.index(character[,start[,end]])

startswith()
检索字符串是否以指定的字符开头。是则返回True,否则返回False
语法:

str_name.startswith (character[,start[,end]])

endswith()
检索字符串是否以指定的字符结尾。是则返回True,否则返回False
语法:

str_name.endswith (character[,start[,end]])

1.6 子母的大小写转换

lower()
将字符串中的大写字母转化为小写字母

str_name.lower()

upper()
将字符串中的小写字母转化为大写字母

str_name.upper()

1.7 去除字符串的空格和特殊字符

用户输入时,字符串前后一般不出现空格与特殊字符,下面介绍如何去除

strip()
用于去掉字符串左右两边的空格与特殊字符

语法:str_name.strip([character])
character:可选参数,不指定则默认

lstrip()
用于去掉字符串左边的空格与特殊字符

语法:str_name.lstrip([character])
character:可选参数,不指定则默认

rstrip()
用于去掉字符串右边的空格与特殊字符

语法:str_name.rstrip([character])
character:可选参数,不指定则默认

1.8 格式化字符串

指先制定一个模板,模板中预留空位,然后在空位上添上内容。这些空位需要指定的符号标记(也叫做占位符),这些占位符不会显示出来

语法:”%[-][+][0][m][.n]格式化字符串”%exp
-:可选参数,用于指定左对齐,正数前方无符号,负数前面加负号
+:可选参数,用于指定右对齐,正数前方加正号,负数前面加负号
0:可选参数,表示右对齐,正数前方无符号,负数前面加负号用0填空白处,与参数m一起使用
m:可选参数,占有宽度
.n:可选参数,保留小数点的位数
exp:需要转化的项
格式化字符 说明 格式化字符 说明
%s 字符串(采用str()显示) %r 字符串(采用repr()显示)
%c 单个字符 %o 八进制整数
%d %i 十进制整数 %e 指数(基底为e)
%x 十六进制整数 %E 指数(基底为E)
%f %F 浮点数 %% 字符%
str_name = "编号:%06d\n姓名:%s" #定义的一个模板
tuple_name = (23,"张三")  #定义一个内容
print(str_name%tuple_name)  #转化并打印

format

语法:template.format(args)
args:需要转化的元组
template:字符串模板,内容如下所示
{[index][:[fill][align][sign][#][width][.precision][type]]}
index:可选参数,索引 
fill:可选参数,空白处的填充字符
align:可选参数,对齐方式 <左对齐 >右对齐
sign:可选参数,指定有无符号 + -
#:可选参数,指定二进制前缀
width:可选参数,指定宽度
.precision:可选参数,指定小数点位数
type:指定格式化类型
格式化字符 说明 格式化字符 说明
s 对字符串类型格式化 b 十进制转二进制
d 十进制整数 o 十进制转八进制
c 十进制整数转化为unicode字符 x X 十进制转十六进制
e E 转化为科学计数法 f F 转浮点数(精确小数点6位)
g G e-f或E-F中切换 % 转百分数(精确小数点6位)
print("{0:,.2f}".format(123456))
print("{0:E}".format(154463.12))
print("{:.0%}".format(0.08))

2 字符串编码转换

国际通用编码UTF-8,python3.X默认使用,解决了中文乱码问题。我国中文编码标准GBK-GB2312
两种常用的字符串类型
str:Unicode字符(ASCII等),在网络传输或保存到磁盘,需要转化为bytes
bytes:二进制数据,带有b前缀
两种不同类型的字符串不能拼接

2.1 encode()

str转化为bytes

语法:str_name.encode([encoding=”utf-8][,errors=”strict”])
[encoding=”utf-8”:可选参数,指定进行转码时采用的字符编码
errors=”strict” :可选参数,指定错误处理方式

2.2 decode()

bytes转str

语法:bytes_name.decode([encoding=”utf-8][,errors=”strict”])
[encoding=”utf-8”:可选参数,指定进行转码时采用的字符编码
errors=”strict” :可选参数,指定错误处理方式

3 正则表达式

记录文本规则的代码

3.1 行定位符

语法:“^”开始,“$”结束
例
^a:匹配以a开头的字符串
b$:匹配以b结尾的字符串

3.2 元字符

元字符 说明 举例
\w - 匹配字母、数字、下划线、汉字 - “rt_12\n汉字”,能匹配中除\n以外的
\W - 匹配字母、数字、下划线、汉字以外的字符 - “rt_12\n汉字”,只能匹配\n
\s 匹配单个空白图(包括Tab和换行符) “123\t321”,只能匹配\t
\S 匹配除单个空白图(包括Tab和换行符)以外的 “123\t321”,匹配除\t以外的字符
\b 匹配单词的开始或结束,单词的分界符通常是空格、标点符号、换行
\d 匹配数字
. 匹配除换行符以外的任意字符
\ber\w*\b  匹配er开头的字符

3.3 限定符

用于限定匹配数量

限定符 说明 举例
? 匹配前面字符<=1次 googl?e -> google googe
+ 匹配前面字符>=1次
* 匹配前面字符>=0次
{n} 匹配前面字符n次
{n,} 匹配前面字符>=n次
{n,m} 匹配前面字符n到m次
例:^\d{8}$   匹配8位数字

3.4 字符类

正则表达式查找数字和字母是很简单的,因为已经有了对应这些字符集合的元字符(如“\d”“\w"),但是如果要匹配没有预定义元字符的字符集合(比如元音字母a,c, i,o,u),应该怎么办?
很简单,只需要在方括号里列出它们就行了,像[aciou]可以匹配任何一个英文元音字母,[.?!] 匹配标点符号(“.”“?”或“!”)。也可以轻松地指定一个字符范围,像“[0-9]” 代表的含义与“\d” b就是完全一致的:一位数字; 同理,“[a-z0-9A-Z_ ]”完全等同于“\w" (如果只考虑英文的话)。说明:要想匹配给定字符串中任意一个汉字,可以使用“[u4e00-\u9fa5]"; 如果要匹配连续多个汉字,可以使用“[u4e00-u9fa5]+”。

3.5 排除字符

3.4小节列出的是匹配符合指定字符集合的字符串。
现在反过来,匹配不符合指定字符集合的字符串。正则表达式提供了“^”字符。
这个元字符在3.1小节中出现过,表示行的开始。
而这里将会放到方括号中,表示排除的意思。
例如:[^a-zA-Z],匹配一个不是字母的字符

3.6 选择字符 |

身份证号码长度为18位。前17位为数字,最后一位是校验位,可能为数字或字符X。在上面的描述中,包含着条件选择的逻辑,这就需要使用选择字符(|) 来实现。

(^\d{18}$) | (^\d{17})(\d|X|x)$   #身份证匹配规则

3.7 转义字符 \

将特殊字符转化为普通字符(. ? \)
IP地址匹配规则

[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}

3.8 小括号()

第一个作用通过3.6知道小括号可改变限定符作用的范围 | * ^
例:(six | four)th 匹配sixth与fourth

第二个作用分组,如.[1-9]{1,3}

3.9 python中使用正则表达式

当匹配的是一个具体的字符是需要对\进行转义

“\\bm\\w*\\b”
r”\bm\w\b”

4 re模块实现正则表达式

导入的re模块没有被引入会报错

4.1 匹配字符串

match()
从字符串的开始进行匹配,起始位置匹配成功则返回match对象,否则返回None

语法:re.match(pattern,string,[ string])
pattern:模式字符串,正则表达式转化而来
string:需要匹配的字符串
string:标准位,可选参数,控制匹配参数
标志	说明
A或ASCII	对于\w. \W、\b、 B、\d. \D、\s 和\S只进行ASCI匹配(仅适用于Python 3.x)
I或IGNORECASE	执行不区分字母大小写的匹配
M或MULTLINE	将^和$用于包括整个字符串的开始和结尾的每一行(默认情况下,仅适用于整个字符串的开始和结尾处)
S或DOTALL	使用(.)字符匹配所有字符,包括换行符
X或VERBOSE	忽略模式字符串中未转义的空格和注释
import re
pattern = r"mr_\w+"
string = "MR_SHOP12 mr_shop1111111"
match = re.match(pattern,string,re.I)
print(match.start())  #匹配的起始位置
print(match.end())    #匹配的结束位置
print(match.span())   #匹配位置的元组
print(match.string)   #匹配的字符串
print(match.group())  #匹配的数据
->>
0
9
(0, 9)
MR_SHOP12 mr_shop1111111
MR_SHOP12
import re
pattern = r"(13[4-9]\d{8})$|(15[01289]\d{8})$" #13开头,[4-9]中任意一个数字为第三位,后面八个整数
mobile_1 = "13844455585"
match = re.match(pattern,mobile_1)
if match == None:
    print(mobile_1,"没找到")
else:
    print("ok")

search()

语法:re.search(pattern,string,[ string])

整个字符串中搜索第一个匹配的值,如果在起始位置匹配成功,则返回match对象,否则返回None

findall()

语法:re.findall(pattern,string,[ string])

在整个字符串中搜索符合正则表达式的字符串,以列表形式返回

4.2 替换字符串

sub()
实现字符串替换

re.sub(pattern,repl,string,count,flags)
pattern:模式字符串,由正则表达式转化而来
repl:替换的字符串
string:原始字符串
count:替换的次数 可选参数
flags:标志位  可选参数
import re
pattern = r"1[34578]\d{9}"
string = "3456436343 13456456712"
result = re.sub(pattern,"12345678901",string)
print(result)

4.3 正则表达式切割字符串

split()
split() 方法用于实现根据正则表达式分割字符串,并以列表的形式返回。其作用同字符串对象的split()方法类似,所不同的就是分割字符由模式字符串指定。

语法:re.split(pattern,string,[maxsplit],[flags])
pattern:模式字符串,由正则表达式转化
string:原字符串
maxsplit:可选参数,最大拆分次数
flags:可选参数,标志位,用于控制匹配方式
import re
pattern = r"[.|=|:|/|//]"
url = "https://www.bilibili.com/?spm_id_from=666.25.b_62696c692d6865616465722d6d.1"
result = re.split(pattern,url)
print(result)

你可能感兴趣的:(python)