写点什么

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

作者:虫无涯
  • 2023-02-28
    陕西
  • 本文字数:5525 字

    阅读完需:约 18 分钟


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


1 字符串常用操作

1.1 拼接字符串

  • 使用“ + ”拼接多个字符串;

  • 不允许与其它类型的数据进行拼接


# -*- coding:utf-8 -*-
str_name = "我的博客地址为:"str_url = "https://blog.csdn.net/NoamaNelson"
str_p = str_name + str_urlprint(str_p)
# 不能与其它类型进行拼接,否则报错str_num = 12345678str_p_num = str_name + str_numprint(str_p_num)
复制代码


结果:


我的博客地址为:https://blog.csdn.net/NoamaNelsonTraceback (most recent call last):  File "F:/python_study/main.py", line 10, in <module>    str_p_num = str_name + str_numTypeError: 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_urlprint("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/NoamaNelsonstr_p_len: 41str_p_len_utf8: 55str_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: Pstr_name_2: Pythonstr_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/NoamaNelson1、默认分割: 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,否返回Falseprint("⑨ 以h开头,应返回True:", str_name.startswith("h"))print("⑩ 不以m开头,应返回False:", str_name.startswith("m"))
# 5、endswith()检索字符串是否以指定的字符串结尾,是返回True,否返回Falseprint("⑾ 以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(零):可选,右对齐



# -*- 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:可选,指定类型



# -*- 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# 那么下边的都可以匹配qw123213qwerererer# 不能匹配以下123qwwerqw
复制代码


常用元字符

2.3 限定符


常用限定符

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 repattern = 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 常用标志


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 repattern = 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:可选,替换的最大次数,默认为 0flags:控制匹配方式


# -*- coding:utf-8 -*-
import repattern = 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 repattern = 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'"]
复制代码


发布于: 刚刚阅读数: 3
用户头像

虫无涯

关注

专注测试领域各种技术研究、分享和交流~ 2019-12-11 加入

CSDN测试领域优质创作者 | CSDN博客专家 | 阿里云专家博主 | 华为云享专家 | 51CTO专家博主

评论

发布
暂无评论
Python字符串和正则表达式的深入学习_Python_虫无涯_InfoQ写作社区