3

Python字符串和正则表达式的深入学习

 1 year ago
source link: https://blog.51cto.com/NoamaNelson/6005800
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Python字符串和正则表达式的深入学习


注:因后续的知识,操作性比较强,所以更多的会偏向实践,不会再整理脑图。


1 字符串常用操作

1.1 拼接字符串

  • 使用“ + ”拼接多个字符串;
  • 不允许与其它类型的数据进行拼接
# -*- coding:utf-8 -*-

str_name = "小明"
str_age = "26"

str_p = str_name + str_age 
print(str_p)

# 不能与其它类型进行拼接,否则报错
str_num = 12345678
str_p_num = str_name + str_num
print(str_p_num)

结果:

小明26
Traceback (most recent call last):
  File "F:/pytest_study/test_case/test.py", line 19, in <module>
    str_p_num = str_name + str_num
TypeError: can only concatenate str (not "int") to str

1.2 计算字符串的长度

  • 使用len()计算字符串长度
  • 语法:len(string)
  • 使用encode()计算对应编码的字符串长度
# -*- coding:utf-8 -*-

str_name = "小明"
str_age = "26"

str_p = str_name + str_age 
print("str_p:", str_p)

str_p_len = len(str_p)
print("str_p_len:", str_p_len)

# 计算对应编码的字符串长度
str_p_len_utf8 = len(str_p.encode())
print("str_p_len_utf8:", str_p_len_utf8)

str_p_len_gbk = len(str_p.encode("gbk"))
print("str_p_len_gbk:", str_p_len_gbk)

结果:

str_p: 小明26
str_p_len: 4
str_p_len_utf8: 8
str_p_len_gbk: 6

1.3 截取字符串

  • 截取方法同序列的截取,因为字符串也是序列
  • 可以使用切片的方法
  • 语法:string[start : end : step] 即:开始,截至,步长
# -*- coding:utf-8 -*-

str_name = "Python学习笔记(7)-Python基础7-字符串与正则表达式"

str_name_1 = str_name[0]  # 截取第一个字符
str_name_2 = str_name[0:6]  # 从第一个字符开始到第六个,第六个取不到
str_name_3 = str_name[14:23]  # 第17个到23个,23个取不到

print("str_name_1:", str_name_1)
print("str_name_2:", str_name_2)
print("str_name_3:", str_name_3)

结果:

str_name_1: P
str_name_2: Python
str_name_3: Python基础7

1.4 分割字符串

  • 分割字符串是把字符串分割为列表
  • 语法:string.spilt(s, max) 即:string为要分割的字符串,s为分割的分隔符,max为分割的次数
# -*- coding:utf-8 -*-

str_name = "https://blog.csdn.net/NoamaNelson"

str_name_1 = str_name.split()
str_name_2 = str_name.split(".")
str_name_3 = str_name.split("//")
str_name_4 = str_name.split("/")
print("0、原字符串:str_name为", str_name)
print("1、默认分割: str_name_1", str_name_1)
print("2、采用‘.’分割:str_name_2为", str_name_2)
print("3、采用'//'分割: str_name_3为", str_name_3)
print("4、采用‘/’分割: str_name_4为", str_name_4)

结果:

0、原字符串:str_name为 https://blog.csdn.net/NoamaNelson
1、默认分割: str_name_1 ['https://blog.csdn.net/NoamaNelson']
2、采用‘.’分割:str_name_2为 ['https://blog', 'csdn', 'net/NoamaNelson']
3、采用'//'分割: str_name_3为 ['https:', 'blog.csdn.net/NoamaNelson']
4、采用‘/’分割: str_name_4为 ['https:', '', 'blog.csdn.net', 'NoamaNelson']

1.5 检索字符串

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

str_name = "https://blog.csdn.net/NoamaNelson"

# 1、count()检索指定字符串在另一个字符串中出现的次数,不存在返回0,存在返回次数
print("① N出现的次数为:", str_name.count("N"))
print("② //出现的次数为:", str_name.count("//"))
print("③ /出现的次数为:", str_name.count("/"))

# 2、find()用于检索是否包含指定的字符串,不包含返回-1,包含返回首次出现该字符串的索引,且从左边开始查找,和rfind()相反
print("④ N包含,应返回索引:", str_name.find("N"))
print("⑤ /包含,应返回索引:", str_name.find("/"))
print("⑥ w不包含,应返回-1:", str_name.find("w"))

# 3、index()和find()类似,用于检索是否包含指定的字符串,当指定的字符串不存在时抛出异常
print("⑦ m包含,应返回索引:", str_name.index("m"))
# print("⑧ w不包含,应抛出异常:", str_name.index("w"))

# 4、startswith()检索字符串是否以指定的字符串开头,是返回True,否返回False
print("⑨ 以h开头,应返回True:", str_name.startswith("h"))
print("⑩ 不以m开头,应返回False:", str_name.startswith("m"))

# 5、endswith()检索字符串是否以指定的字符串结尾,是返回True,否返回False
print("⑾ 以n结尾,应返回True:", str_name.startswith("n"))
print("⑿ 不以m结尾,应返回False:", str_name.startswith("m"))

结果:

① N出现的次数为: 2
② //出现的次数为: 1
③ /出现的次数为: 3
④ N包含,应返回索引: 22
⑤ /包含,应返回索引: 6
⑥ w不包含,应返回-1: -1
⑦ m包含,应返回索引: 25
⑨ 以h开头,应返回True: True
⑩ 不以m开头,应返回False: False
⑾ 以n结尾,应返回True: False
⑿ 不以m结尾,应返回False: False

1.6 字母的大小写转换

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

str_name = "https://blog.csdn.net/NoamaNelson"

"""
1、lower()将字符串中的大写字母转换为小写字母
   : 如果字符串中没有被转换的字符,将原字符串返回;
   : 否则返回一个新的字符串,大写转换成小写,其它不变,长度也不变
2、upper()将字符串中的小写字母转换为大写字母
   : 如果字符串中没有被转换的字符,将原字符串返回;
   : 否则返回一个新的字符串,小写转换成大写,其它不变,长度也不变
"""
print("原字符串为:", str_name)
print("可以发现字符串中的大写N,转换成小写n:", str_name.lower())
print("可以发现所有小写都转换为大写了:", str_name.upper())

结果:

原字符串为: https://blog.csdn.net/NoamaNelson
可以发现字符串中的大写N,转换成小写n: https://blog.csdn.net/noamanelson
可以发现所有小写都转换为大写了: HTTPS://BLOG.CSDN.NET/NOAMANELSON

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

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

str_name = "  https://blog.csdn.net/NoamaNelson  \t\n\r"

"""
1、strip()去除字符串左右两侧的空格和特殊字符
   : 带参数,则去除指定的字符
   : 不带参数,则去除空格、制表符、回车符、换行符等
2、lstrip()去除字符串左侧的空格和特殊字符
   : 带参数,则去除指定的字符
   : 不带参数,则去除空格、制表符、回车符、换行符等
3、rstrip()去除字符串右侧的空格和特殊字符
   : 带参数,则去除指定的字符
   : 不带参数,则去除空格、制表符、回车符、换行符等
"""
print("① 原字符串为:", str_name)
print("② 去除空格、制表符、回车符、换行符等:", str_name.strip())
print("③ 去除空格:", str_name.strip(" "))
print("④ 去除换行和制表符:", str_name.strip("\n\t"))
print("⑤ 去除左侧的空格:", str_name.lstrip(" "))
print("⑥ 去除右侧的空格和所有特殊字符:", str_name.rstrip())

结果:

① 原字符串为:   https://blog.csdn.net/NoamaNelson  	

② 去除空格、制表符、回车符、换行符等: https://blog.csdn.net/NoamaNelson
③ 去除空格: https://blog.csdn.net/NoamaNelson  	

④ 去除换行和制表符:   https://blog.csdn.net/NoamaNelson  	

⑤ 去除左侧的空格: https://blog.csdn.net/NoamaNelson  	

⑤ 去除右侧的空格和所有特殊字符:   https://blog.csdn.net/NoamaNelson

1.8 格式化字符串

1.8.1 使用"%"操作符

  • 语法:“%[-][+][0][m][.n]格式化字符串”%

—:可选,左对齐,指定正数前无符号,负数前加负号
+:可选,右对齐,指定正数前加正号,负数前加负号
0(零):可选,右对齐

Python字符串和正则表达式的深入学习_正则表达式
# -*- coding:utf-8 -*-

t = "文章编号: %08d\t 博客名称: %s\t 博客地址:blog.csdn.net/%s"
t_context1 = (234, "NoamaNelson", "NoamaNelson")
print(t%t_context1)

print("姓名:%s\t 学号:%06d\t 班级:%s一班" % ("张三", 23, "高三"))

结果:

文章编号: 00000234	 博客名称: NoamaNelson	 博客地址:blog.csdn.net/NoamaNelson
姓名:张三	 学号:000023	 班级:高三一班

1.8.2 使用字符串对象的format()方法

  • 语法:string.format(s)

str:指定字符串的显示样式(即模板);s指定要转换的项,若有多项用逗号隔开。

  • 创建模板时使用" {} " 和 " : "指定占位符

格式为:{[index] [:[fill]align] [sign] [#] [width] [.precision][type]] }
① index:可选,设置格式的对象在参数列表中的位置
② fill:可选,指定对齐方式("<“左对齐,”>“右对齐,”=“右对齐-对数字类型有效,”^"居中(配合with使用))
③sign:可选,指定有无符号
④#:可选,对二、八、十六进制,加上#号表示有前缀“\0b\0o\0x”
⑤width:可选,所占宽度
⑥ .precision:可选,保留的小数位数
⑦type:可选,指定类型

Python字符串和正则表达式的深入学习_正则表达式_02
# -*- coding:utf-8 -*-

t = "文章编号: %08d\t 博客名称: %s\t 博客地址:blog.csdn.net/%s"
t_context1 = (234, "NoamaNelson", "NoamaNelson")
print(t.format(t_context1))

print("姓名:%s\t 学号:%06d\t 班级:%s一班".format("张三", 23, "高三"))

结果:

文章编号: %08d	 博客名称: %s	 博客地址:blog.csdn.net/%s
姓名:%s	 学号:%06d	 班级:%s一班

上边的基础学习,还是很有收获的,起码对字符串的常用操作有了一定的认知!!还是得加油啊

Python字符串和正则表达式的深入学习_正则表达式_03

2 正则表达式

2.1 行定位符

  • 用来描述子串的边界,“ ^ ”为行开始," $ "为行结尾
^python # 行首匹配
python is my favourite programing language! # 这个是可以匹配的
who is my favourite programing language of python! # 这个不能匹配

2.2 元字符

  • 除了前边的“^”和"$"外,还有很多元字符
  • 如格式:\bqw\w*\b

①表示用于匹配以字母qw开头的单词
②先从某个单词开始处(\b),然后匹配字母qw,接着是任意的字母或字符(\w*),最后是单词结束处(\b)

# 如匹配格式: \bqw\w*\b
# 那么下边的都可以匹配
qw123213
qwerererer
# 不能匹配以下
123qw
werqw

常用元字符

代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母、数字、下划线或汉字
\W 匹配除字母、数字、下划线或汉字以外的字符
\s 匹配单个空白符(包括tab键和换行符)
\S 匹配除单个空白符(包括tab键和换行符)以外的所有字符
\d 匹配数字
\b 匹配单词的开始或结束,单词的分界符通常是空格、标点符号或者换行
^ 匹配字符串的开始
$ 匹配字符串的结尾

2.3 限定符

常用限定符

限定符 说明
? 匹配前边的字符零次或一次
+ 匹配前边的字符一次或多次
* 匹配前边的字符零次或多次
{n} 匹配前边的字符n次
{n,} 匹配前边的字符最少n次
{n,m} 匹配前边的字符最少n次,最多m次

2.4 字符类

  • [aeiou],匹配任何一个英文元音字母
  • [.?!],匹配标点符号(" . " 或" ? “或” ! ")
  • [0-9],和"\d"一样,0-9任意一个数字
  • [a-z0-9A-Z],等同于"\w"

2.5 排除字符

  • " ^ "表示行的开始,如果放在[ ]中表示排除
  • 如[a-zA-Z]表示匹配一个不是字母的字符

2.6 选择字符

  • 使用" | “来表示,意思为"或”
"(^\d{15}$) | (^\d{18}$) | (^\d{17})(\d|X|x)$"
# 匹配身份证规则:皮皮额15为数字,或者18位数字,或者17位数字和最后一位(X或x)

2.7 转义字符

# 匹配127.0.0.1
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

2.8 分组

# 使用()即可
# (ma|pa)th,匹配math和path

2.9 正则表达式语法

'[^a-zA-Z]' # 匹配不是字母的一个字符
'\\bj\\w*\\b'  # 匹配以字母j开头的字符,要把\进行转义
# 或者写成r或R开头,r'\bj\w*\b'

3 使用re模块实现正则表达式

使用以下引入re模块即可

import re

3.1 匹配字符串

3.1.1 match()方法

  • 从字符串的开始处进行匹配,匹配成功返回Match对象,失败返回None
  • 语法:re.match(pattern,s,flags)

pattern:模式字符串
s:要匹配的字符串
flags:可选,控制匹配方式

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

import re
pattern = r"http\w+"
s = "HTTPS://blog.csdn.net/NoamaNelson"
s1 = "博客地址HTTPS://blog.csdn.net/NoamaNelson"
mymatch = re.match(pattern, s, re.I)
mymatch1 = re.match(pattern, s1, re.I)
print(mymatch)
print(mymatch1)

flags常用标志

标志 说明
A或ASCII 只进行ASCII 匹配
I或IGNORECASE 匹配不区分大小写
M或MULTILINE 将^和$用于包括整个字符串的开始和结尾的每一行
S或DOTALL 使用(.)字符匹配所有字符
X或VERBOSE 忽略模式字符串中未转义的空格和注释

3.1.2 search()方法

  • 用于再整个字符串中搜索第一个匹配的值,成功返回对象,失败返回None
  • 语法:re.search(pattern,s,flags)

pattern:模式字符串
s:要匹配的字符串
flags:可选,控制匹配方式

3.1.3 findall()方法

  • 用于再整个字符串中搜索所有符合正则表达式的字符串,成功返回包含匹配结构的列表,失败返回空列表
  • 语法:re.findall(pattern,s,flags)

pattern:模式字符串
s:要匹配的字符串
flags:可选,控制匹配方式

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

import re
pattern = r"http\w+"
s = "HTTPS://blog.csdn.net/NoamaNelson"
s1 = "博客地址HTTPS://blog.csdn.net/NoamaNelson"
mymatch = re.findall(pattern, s, re.I)
mymatch1 = re.findall(pattern, s1, re.I)
print(mymatch)
print(mymatch1)

结果:

['HTTPS']
['HTTPS']

3.2 替换字符串

  • sub()方法用于字符串替换
  • 语法:re.sub(patern, repl, s, count, flags)

patern:模式字符串
repl:替换的字符串
s:原始字符串
count:可选,替换的最大次数,默认为0
flags:控制匹配方式

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

import re
pattern = r"8[345]\d{6}"
s = "NoamaNelson的文章中编号为:83578910的文章,暗码为123456789"
result = re.sub(pattern, "98765432", s)
print(result)

结果:

NoamaNelson的文章中编号为:98765432的文章,暗码为123456789

3.3 正则表达式分割字符串

  • 语法:re.spilt(pattern, s, [maxsplit], [flags])

pattern:模式字符串
s:要匹配的字符串
maxsplit:可选,最大的拆分次数
flags:可选,控制匹配方式

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

import re
pattern = r"[?|&]"
s = "http://www.wertyy.com/login.jsp?username='admin'&password='123456'"
result = re.split(pattern, s)
print("原字符串:", s)
print("分割后的字符串:", result)

结果:

原字符串: http://www.wertyy.com/login.jsp?username='admin'&password='123456'
分割后的字符串: ['http://www.wertyy.com/login.jsp', "username='admin'", "password='123456'"]

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK