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

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

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


1 字符串常用操作

1.1 拼接字符串

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

str_name = "我的博客地址为:"
str_url = "https://blog.csdn.net/NoamaNelson"

str_p = str_name + str_url
print(str_p)

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

结果:

我的博客地址为:https://blog.csdn.net/NoamaNelson
Traceback (most recent call last):
  File "F:/python_study/main.py", line 10, 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_url = "https://blog.csdn.net/NoamaNelson"

str_p = str_name + str_url
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: 我的博客地址为:https://blog.csdn.net/NoamaNelson
str_p_len: 41
str_p_len_utf8: 55
str_p_len_gbk: 48

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[.n]格式化字符串"%
  • 说明:
—:可选,左对齐,指定正数前无符号,负数前加负号
+:可选,右对齐,指定正数前加正号,负数前加负号
0(零):可选,右对齐
转换说明符 解释
%d、%i 转换为带符号的十进制整数
%o 转换为带符号的八进制整数
%x、%X 转换为带符号的十六进制整数
%e 转化为科学计数法表示的浮点数(e 小写)
%E 转化为科学计数法表示的浮点数(E 大写)
%f、%F 转化为十进制浮点数
%g 智能选择使用 %f 或 %e 格式
%G 智能选择使用 %F 或 %E 格式
%c 格式化字符及其 ASCII 码
%r 使用 repr() 函数将表达式转换为字符串
%s 使用 str() 函数将表达式转换为字符串
# -*- 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] }
① index:可选,设置格式的对象在参数列表中的位置
② fill:可选,指定对齐方式("<"左对齐,">"右对齐,"="右对齐-对数字类型有效,"^"居中(配合with使用))
③sign:可选,指定有无符号
④#:可选,对二、八、十六进制,加上#号表示有前缀“\0b\0o\0x”
⑤width:可选,所占宽度
⑥ .precision:可选,保留的小数位数
⑦type:可选,指定类型
type类型值 含义
s 对字符串类型格式化。
d 十进制整数。
c 将十进制整数自动转换成对应的 Unicode 字符。
e 或者 E  转换成科学计数法后,再格式化输出。
g 或 G 自动在 e 和 f(或 E 和 F)中切换。
b 将十进制数自动转换成二进制表示,再格式化输出。
o 将十进制数自动转换成八进制表示,再格式化输出。
x 或者 X 将十进制数自动转换成十六进制表示,再格式化输出。
f 或者 F 转换为浮点数(默认小数点后保留 6 位),再格式化输出。
% 显示百分比(默认显示小数点后 6 位)。
# -*- 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一班

上边的基础学习,还是很有收获的,起码对字符串的常用操作有了一定的认知!!还是得加油啊
在这里插入图片描述


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'"]
目录
相关文章
|
19天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
1天前
|
数据可视化 数据挖掘 大数据
1.1 学习Python操作Excel的必要性
学习Python操作Excel在当今数据驱动的商业环境中至关重要。Python能处理大规模数据集,突破Excel行数限制;提供丰富的库实现复杂数据分析和自动化任务,显著提高效率。掌握这项技能不仅能提升个人能力,还能为企业带来价值,减少人为错误,提高决策效率。推荐从基础语法、Excel操作库开始学习,逐步进阶到数据可视化和自动化报表系统。通过实际项目巩固知识,关注新技术,为职业发展奠定坚实基础。
|
10天前
|
Python
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
|
21天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
25天前
|
存储 程序员 Python
Python学习的自我理解和想法(2)
今日学习Python第二天,重点掌握字符串操作。内容涵盖字符串介绍、切片、长度统计、子串计数、大小写转换及查找位置等。通过B站黑马程序员课程跟随老师实践,非原创代码,旨在巩固基础知识与技能。
|
25天前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
21天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
20天前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
22天前
|
存储 索引 Python
Python学习的自我理解和想法(4)
今天是学习Python的第四天,主要学习了列表。列表是一种可变序列类型,可以存储任意类型的元素,支持索引和切片操作,并且有丰富的内置方法。主要内容包括列表的入门、关键要点、遍历、合并、判断元素是否存在、切片、添加和删除元素等。通过这些知识点,可以更好地理解和应用列表这一强大的数据结构。
|
21天前
|
索引 Python
Python学习的自我理解和想法(5)
这是我在B站千锋教育学习Python的第五天笔记,主要内容包括列表的操作,如排序(`sort()`、``sorted()``)、翻转(`reverse()`)、获取长度(`len()`)、最大最小值(`max()`、``min()``)、索引(`index()`)、嵌套列表和列表生成(`range`、列表生成式)。通过这些操作,可以更高效地处理数据。希望对大家有所帮助!