Python知识整合(字符串及正则表达式)

1、字符串常规操作

1.1、拼接字符串

使用“+”号可以实现多个字符串的拼接,并产生一个字符串对象。

a = "123"
print(a+"1234")

1.2计算字符串长度

使用len()函数

str ="123a,时候"
print(len(str))

输出

7

可以看出在len函数计算字符串的长度时,不区分数字,英文,汉字,所有字符都认为是一个字节
但是,如果采用UTF-8编码,汉字占3个字节,采用GBK或者GB2312编码时,汉字占2个字节

str ="123a,时候"
print(len(str.encode()))   #utf-8编码
  print(len(str.encode(gbk)))   #gbk编码 

输出

15
12

1.3、截取字符串

通过切片方法实现
语法格式如下

string(start : end : step)

str = "你就是个啊哈"
 str1 = str[1]       #截取第二个字符
 str1 = str[2:]      #从第3个字符开始截取
 str2 = str[:2]      #从左边开始截取2个字符
 str3 = str[2:4]   #截取第3个到第4个字符

1.4、分隔字符串

使用split函数分隔
语法格式

str.split(sep,maxsplit)

说明
1、str:表示进行分隔的字符串
2、sep表示指定的分隔符,可以包含多个指定字符,如果不指定,那么默认为None,即所有的空字符(包括空格,\n等等)
3、maxsplit:可选参数,用于指定分隔的次数,如果不指定或者为-1,分隔次数没有限制,否则返回的元素最多为maxsplit+1。
4、如果不指定sep,也不能指定maxsplit
5、返回值为字符串列表

1.5、检索字符串

1、count方法
count()方法检索字符串在另一个字符串中出现的次数。如果字符串不存在返回0,否则返回次数,其语法格式如下。

str.count(sub[,start[,end]])

说明:
str表示原字符串
sub表示要检索的字符串
start表示可选参数,检索的起始位置,若不指定,从头检索
end,与start相似。

2、find方法
检索是否包含指定的字符串,如果检索的字符串不存在则,返回-1,否则返回该字符串首次出现的索引
语法格式

str.find(sub[,start[,end]])

3、index()方法
与find()方法类似,不过使用index()方法,当指定的字符串不存在时抛出异常
语法格式

str.index(sub[,start[,end]])

4、startwith()方法
检测是否以指定字符串开头,是返回True,不是返回False
语法格式:

str.startswith(prefix[,start[,end]])

参数说明,str表示原字符串,prefix表示要检索的字符串
其他参数说明与find()方法类似

5、endwith()方法
检测是否以指定字符串结尾,是返回True,不是返回False
语法格式

str.endswith(suffix[,start[,end]])

1.6、字母的大小写转换

1、lower()方法
将字符串中的全部的大写字母转化为小写字母。
语法格式:

str.lower()

2、upper()方法
将字符串中的全部的小写字母转化为大写字母。
语法格式:

str.upper()

3、swapcase()方法
同时将字符串中的全部的小写字母转化为大写字母,全部的大写字母转化为小写字母。

str.swapcase()

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

特殊字符在这里指的是:\t \r \n(制表、回车、换行)
1、strip()方法
去除字符串的左右两侧的空格和特殊字符
语法格式

str.strip([chars])

str1 = " 12323 \n"
print("原字符串str1:" + str1)
print("字符串:" + str1.strip() + ".")   # 去除首尾的空格和特殊字符
str2 = "#133#."
print("原字符串str2:" + str2)
print("字符串:" + str2.strip('#.'))         #去除首位的#或者.

输出

原字符串str1: 12323 

字符串:12323.
原字符串str2:#133#.
字符串:133

2、lstrip()方法
lstrip()方法可以去除字符串左侧的空格和特殊字符,
语法格式

str.lstrip([chars])

3、rstrip()方法
rstrip()方法可以去除字符串由右侧的空格和特殊字符,
语法格式

str.rstrip([chars])

1.8、格式化字符串

格式化字符串就是先定义一个模板,然后在模板中留几个空位,空位用占位符来标记

1、使用%号操作符(逐渐没落)

常用的格式化字符
| 格式化字符 | 说明 | 格式化字符 | 说明 |
| ———- | ——————— | ———- | ———————- |
| %s | 字符串(采用str显示) | %r | 字符串(采用repr显示) |
| %c | 单个字符 | %o | 八进制整数 |
| %d或者%i | 十进制整数 | %e | 指数(基地写为e) |
| %x | 16进制整数 | %E | 指数(基地写为E) |
| %f或者%F | 浮点数 | %% | 字符% |

a = "小明为莆田%d中学生,学号为%d,同学都叫他%s"   # 定义模板
b1 = (6, 31111111, '小明')                   # 定义与转化的内容
print(a % b1)                               # 格式化输出

输出

小明为莆田6中学生,学号为31111111,同学都叫他小明

2、使用字符串对象的format()方法(推荐使用)
语法格式

str.format(args)

args用于指定与转化的项

format()方法中常用的格式化字符
| s | 对字符串类型进行格式化 |
| ——– | ——————————————- |
| b | 将十进制数自动转换成二进制数表示再格式化 |
| d | 十进制整数 |
| o | 将十进制数自动转换成八进制数表示再格式化 |
| c | 将十进制数自动转换成对应的unicode字符 |
| x 或者 X | 将十进制数自动转换成十六进制数表示再格式化 |
| e或者E | 转化为科学计数法表示再格式化 |
| f或者F | 转化为浮点数(默认小数点后保留6位)再格式化 |
| g或者G | 自动在e和f或者E和F中切换 |
| % | 显示百分比(默认小数点后保留6位) |

a = "小明为莆田{:d}中学生,学号为{:0>7d},同学都叫他{:s}"   # 定义模板
b1 = a.format(6, 31111111, '小明')             # 定义与转化的内容
print(b1)            # 格式化输出

输出

小明为莆田6中学生,学号为31111111,同学都叫他小明

2、正则表达式基础

2.1、行定位符

行定位符就是用来描述字符串的边界。“^”表示行的开始,“$”表示行的结尾

^tm$

2.2、常用的元字符

代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母数字、下划线或者汉字
\s 匹配任意的空格符
\d 匹配数字
\b 匹配单词的开始或者结束
^ 匹配字符串的开始
$ 匹配字符串的结尾

2.3、限定符

如匹配8位QQ号码可以使用下面的方式表示

^\d{8}$

常用的限定符
| 限定符 | 说明 | 举例 |
| —— | ——————————- | ——————————————— |
| ? | 匹配前面的字符零次或者一次 | app?le,该表达式可以匹配apple或者aple |
| + | 匹配前面的字符者一次或多次 | app+le,该表达式可以匹配apple到app….le |
| | 匹配前面的字符者零次或多次 | apple,该表达式可以匹配aple到app….le |
| {n} | 匹配前面的字符者n次 | app{2}le,该表达式可以匹配appple |
| {n,} | 匹配前面的字符者最少n次 | app{2,}le,该表达式可以匹配appple到appp…le |
| {n,m} | 匹配前面的字符者最少n次,最多m次 | app{2,3}le,该表达式可以匹配appple或者apppple |

2.4、字符类

如果匹配没有预定义的元字符的字符集合(比如元音字母a,e,i,o,u)我们可以使用方括号,然后把要匹配的内容写在方括号里,如[aeiou]匹配任何一个元音字母。
[0-9]与\d的效果一样
[a-z0-9A-Z]与\w的效果一样(只考虑英文)
[\u4e00-\u9fa5]匹配给定字符串的任意一个汉字,匹配连续多个汉字[\u4e00-\u9fa5]+

2.5、排除字符

把^放在方括号里就是排除的意思

[^a-zA-Z]

该表达式用于匹配一个不是字母的字符串

2.6、选择字符

例子,匹配身份证号码
身份证号码为15位或者18位,如果是15位的全为数字,如果是17位,则最后一位是效验位,为数字或者X(x)
可以使用下面表达式匹配

^\d{15})|(^\d{18}) |(^\d{17} (\d|X|x)$

意思是匹配15位或者18位数字或者17位数字和最后一位是数字或者X或者x

2.7、转义字符

正则表达式中的转义字符也是将特殊字符(“.”、“?”,“\”)变为普通的字符
。如用正则表达式表示127.0.0.1这样格式的IP地址

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

注意括号在正则表达式也算一个字符

2.8、分组

例子

(thir|four)th

意思是匹配单词thirth或者fourth,如果不使用小括号,就变成了匹配单词thir和fourth

小括号的第二个作用就是分组。

(\.[1-9]{1,3}){2},就是对(\.[1-9]{1,3})进行操作

2.9、在python中使用正则表达式语法

在Python中使用正则表达式就是将其作为模式字符串使用的。
将匹配以m开头的正则表达式转化为模式字符串

'\\bm\\w*\\b'

因为模式字符串可能包含大量的特殊字符和斜杠,所以需要使用原生字符串
就是在模式字符串前加上r或者R.

r ‘\bm\w*\b’

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

3.1、匹配字符串

1.使用match()方法进行匹配
如果在其实位置匹配成功,则返回Match对象,否则返回None,其语法格式如下:

re.match(pattern,string,[flags])

说明
pattern:表示模式字符串,由要匹配的正则表达式转换而来
string:表示要匹配的字符串
flags:可选参数,表示标识位,用于控制匹配方式,如是否区分字母大小写。
常用的标志如下表所示
| 标志 | 说明 |
| ————- | ———————————————————— |
| A或ASCII | 对\w、\W、\b、\B、\d、\D、\s、\S只进行ASCII匹配(只适用Python3.x) |
| I或ICNORECASE | 执行不按字母大小写匹配 |
| M或MULTLINE | 将^和$用于包括整个字符串的开始和结尾的每一行 |
| S或DOTALL | 使用“.”字符匹配所有字符,包括换行符 |
| X或VERBOSE | 忽略模式字符串中为转义的空格和注释 |

import re
pattern = r'mr_\w+'    # 模式字符串
string = 'MR_SHOP mr_shop'   # 要匹配的字符串
match = re.match(pattern, string,re.I)  # 匹配字符串不区分大小写
print("匹配值的起始位置:", match.start())
print("匹配值的结束位置:", match.end())
print("匹配位置的元组:", match.span())
print("要匹配的字符串:", match.string)
print("匹配数据", match.group())

输出

匹配值的起始位置: 0
匹配值的结束位置: 7
匹配位置的元组: (0, 7)
要匹配的字符串: MR_SHOP mr_shop
匹配数据 MR_SHOP

2、使用search()方法进行匹配
search()方法用于在整个字符串的搜索第一个匹配的值,如果在匹配成功返回match对象,否则返回None
语法格式

re.search(pattern,string,[flags])

参数说明参考match方法

3、使用findall()方法进行匹配
findall方法主要用于整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功返回包含匹配结构的列表,否则返回空列表。
语法格式

re.findall(pattern,string,[flags])

参数说明参考match方法

import re
pattern = r'([1-9]{1,3}(\.[0-9]{1,3}){3})'
str1 = '127.0.0.1 192.168.122.2'
match = re.findall(pattern, str1)
for i in match:
    print(i[0])

输出

127.0.0.1
192.168.122.2

3.2、替换字符

使用sub()方法进行字符串替换
语法格式

re.sub(pattern, repl, string, count, flags)

说明
pattern:表示模式字符串
repl:表示替换的字符串
string:表示要被查找替换的原始字符串
count: 可选参数表示模式匹配后替换的最大次数,默认为0表示替换所有的匹配
flags: 可选参数,表示标志位,用于控制匹配方式,如区分大小写等,参考match()方法

例子

import re
pattern = r'1[34578]\d{9}'
string = '中奖号码为:84795643 联系电话为:13611111111'
result = re.sub(pattern, '1xxxxxxxxxx', string)
print(result)

输出

中奖号码为:84795643 联系电话为:1xxxxxxxxxx

3.3、使用正则表达式分隔字符串

split()方法进行分隔字符串,并以列表形式返回
语法格式

re.split(pattern, string, [maxsplit], [flags])

说明
pattern:表示模式字符串
string:表示要匹配的字符串
maxsplit: 可选参数,表示最大的拆分次数
flags: 可选参数,表示标志位,用于控制匹配方式,如区分大小写等,参考match()方法
例子

import re
pattern = r'[?|&]'
url = 'http://www.baidu.com?a=xxx&b=yyyy'
result = re.split(pattern, url)
print(result)

输出

['http://www.baidu.com', 'a=xxx', 'b=yyyy']

4、牛刀小试

4.1、按要求输出字符串

已知字符串word=”aS98hdkHFSWEas754”,.编写一- 个程序,分别实现如下功能:
●请将word字符串中的大写字母改为小写字母,小写字母改为大写字母,
●请将word字符串中的数字取出,并输出成一 一个新的字符串

普通版:

word = "aS98hdkHFSWEas754"
 a = ""
 b = ""
 for i in word:
     if  97 <= ord(i) <= 122:        #  小写字母变大写
         a = a + i.upper()              
     elif   65 <= ord(i) <= 90:      # 大写字母变小写
        a = a + i.lower()
     else:                                        
         a = a + i                   # 数字不变
         b = b + i                   # 数字取出,组成新的字符串
 word = a
 print(word)
 print(b)

升级版:

word = "aS98hdkHFSWEas754"
word = word.swapcase()   # word字符串中的大写字母改为小写字母,小写字母改为大写字母
b = ""
for i in word:
    if '0'<=i <='9':
        b = b + i      # 数字取出,组成一个新的字符串
print(word)
print(b)

4.2、输出生日信息

张三的身份证号码是“210011196809210451”.请提取张三的生日信息并输出。

前置知识,身份证的第七位到第14位是出生日期,11位到14位是生日

number = "210011196809210451"
birthday = '张三的生日为:{:s}月{:s}日'                   # 定义模块化字符串
print(birthday.format(number[10:12], number[12:14]))   # 使用format方法输出张三生日

4.3、不重复字母

已知字符串word=”ABDPISDNGDA”.请去除word字符串多次出现的字母,仅留最先出现的一个。例如aabc经过去除后,输出abc。

b =""
word="ABDPISDNGDA"

for i in word:

    if i not in b:
        b += i
print(b)

4.4、英文句子倒叙输出

将一句英文句于单词顺序留序输出,但是不改变单词结构。例如: 1 am a beautiful ginl,输出为girl beautiful a am I

a = input("请输入英文句子:")
b = a.split()                      # 将字符串按空格分开,生产一个列表
c = ""
for index, item in enumerate(b):   # 利用索引倒叙输出列表的值,并拼接为字符串
    c = c + b[-1 - index] + " "
print(c)

输出

请输入英文句子:You are a beautiful girl
girl beautiful a are You 
0%