一、正则基本知识
为什么需要正则?
1.文本处理已经成为计算机常见的工作之一
2.对文本内容进行快速搜索定位,提取是比较繁琐和复杂的
3.为了解决这个问题,产生正则表达式
作用:
可以称之为文本的高级匹配模式,提供搜索、替换、查找等功能,
本质是由一系列特殊符号和字符组成的字符串
特点:
方便进行检索修改文本的操作
支持多种编程语言
使用起来比较灵活
使用或设计正则表达式的原则:
1)正确性:能够正确的匹配要求内容
2)唯一性:除了需要的内容,尽可能减少不需要的内容
3)全面性:对目标特征考虑全面,不遗漏咋们需要的内容
Python 使用正则——————— re模块
二、正则相关函数
import re
"""
re.findall(pattern,str)
功能:使用正则表达式匹配字符串
参数:
pattern:正则表达式字符串
str:目标字符串 或者 原字符串
返回值:返回匹配到的内容
元字符:
在正则表达式中,有一定含义的特殊字符
"""
"""
1.匹配普通字符 比如 a b c & #
匹配规则:匹配字符串本身
"""
str = "abcdefg"
L = re.findall("abc",str)
print(L)
str1 = "山对面的朋友你好吗?"
L1 = re.findall("你好",str1)
print(L1)
"""
2.或 ————>元字符:|
匹配规则:匹配 | 两边任意一个正则表达式
注意: | 的两边不要有空格
"""
str3 = "abcdaasabacsdfabaf"
L2 = re.findall("ab|ba",str3)
print(L2)
"""
3.匹配单一字符 —————>元字符:.
规则:匹配除了\n以外的任意一个字符
"""
str4 = "abc adc a@c abd"
L4 = re.findall("a.c",str4)
print(L4)
"""
4.匹配开始位置 —————>元字符:^
规则:匹配一个字符串开头的位置
"""
str5 = "abc adc a@c bcd"
L5 = re.findall("^ab",str5)
L55 = re.findall("^cd",str5)
print(L5)
print(L55)
str5 = "hello python"
L5 = re.findall("^hello",str5)
print(L5)
"""
5.匹配结尾位置—————>元字符:$
规则:匹配字符串结束的位置
"""
str6 = "abc adc a@c bcd"
L6 = re.findall("cd$",str6)
print(L6)
"""
6.匹配重复————>元字符:*
规则:匹配前面的正则表达式重复 0次或者多次
"""
str7 = "abbbcabcdaccccdadddcaad"
L7 = re.findall("ab*",str7)
print(L7)
"""
7.匹配重复——————>元字符:+
规则:匹配前面的正则表达式1次或者多次
"""
str8= "abbbcabcdaccccdadddcaad"
L8 = re.findall('ab+',str8)
print(L8)
"""
8.匹配重复————>元字符:?
规则:匹配前面出现的字符 0次 或者 1次
"""
str9= "abbbcabcdaccccdadddcaad"
L9 = re.findall('ab?',str9)
print(L9)
"""
9.匹配重复————>元字符:{n}
规则:匹配前面的正则出现n次
"""
str10= "abbbcabcdaccccdadddcaad"
L10 = re.findall('ab{3}',str10)
print(L10)
"""
10.匹配重复————>元字符:{m,n}
规则:匹配前面正则出现m次到n次
"""
str11 = "abbbcabcdaccccdadddcaad"
L11 = re.findall('ab{1,3}',str11)
print(L11)
"""
11.匹配字符集————>元字符:[字符集]
规则:匹配括号内任意一个字符
比如:
[abc123] #匹配:a b c 1 2 3
[a-z] #匹配小写字母
[A-Z] #匹配大写字母
[0-9] #数字
[0-9A-Za-z] #匹配任意数字和字符
"""
str12 = "abbb ABABA 1133"
L12 = re.findall('[A-Z]',str12)
print(L12)
"""
12.匹配字符集 ————>元字符:[^...]
规则:除了字符集中的任意一个字符
[^abc] ————> def...
"""
str13 = "abbb ABABA 1133"
L13 = re.findall('[^abB]',str13)
print(L13)
"""
13.匹配任意(非)数字字符————>元字符:\d \D
规则:
\d匹配的是任意数字字符 相当于:[0-9]
\D匹配任意非数字字符,相当于:[^0-9]
"""
str14 = "15827309203"
str141 = "18872126634"
L14 = re.findall('1[3,5,8,7]\d{9}',str14)
L141 = re.findall('1[8]\d{9}',str141)
L142 = re.findall('1[1]\d{9}',str141)
print(L14)
print(L141)
print(L142)
"""
14.匹配空(非空)字符串 ————> \s \S
规则:
\s:匹配任意空字符
\S:匹配任意非空字符
"""
str15 = "hello python"
L15 = re.findall('\s+',str15)
L151 = re.findall('\S+',str15)
print(L15)
print(L151)
"""
判断以下哪几个是手机号:
13811011234
1da34923hh44
87123444
13ababdbddd
135353534535353
138110112341
"""
list = ["13811011234","1da34923hh44","1da34923hh44","13ababdbddd","135353534535353","138110112341"]
for i in list:
L13 = re.findall('1[3,5,8,7]\d{9}$',i)
if L13 != []:
print(i,"是手机号!")
"""
1.re.findall() 查找目标字符串
2.re.split(pattern,str)
功能:通过正则表达式,切割字符串
参数:pattern:正则 str:元字符串
返回值:分割后的字符串列表
"""
str14 = "abbbbbcdsadsab"
L14 = re.split("b",str14)
print(L14)
"""
3.re.sub(pattern,replace,str)
功能:替换正则匹配的内容
参数:
pattern:正则 replace:要替换的内容 str:目标字符串
返回值:返回替换后的字符串
"""
str15 = "abcdef"
str151 = re.sub("a|b","9",str15)
print(str151)
"""
4.re.match(pattern,str)
功能:匹配目标字符串开头位置
参数:pattern:正则 str:目标字符串
返回值:匹配到的内容
"""
str16 = "hello 123"
L16 = re.match("(he)l(lo)",str16).group(0)
L163 = re.match("(he)l(lo)",str16).group(1)
L162 = re.match("(he)l(lo)",str16).group(2)
L161 = re.match("hello",str16).group(0)
print(L16)
print(L163)
print(L162)
print(L161)
"""
5.re.search(pattern,str)
功能:匹配目标字符串,只能匹配第一个
参数:pattern:正则 str:目标字符串
返回值:匹配到的内容
"""
str17 = "ababcdbaabsder"
L17 = re.findall("ab",str17)
print(L17)
L171 = re.search("ab",str17).group(0)
print(L171)
"""
6.贪婪模式和非贪婪模式
1)贪婪模式:
正则表达式的重复,默认总是尽可能的向后 匹配内容
* + ? {m,n}
2)非贪婪模式:
正则表达式的重复,尽可能少的向后匹配,能0次决定不1次,能1次绝不2次
*? +? ?? {m,n}?
注意:如果想把贪婪模式变换为非贪婪模式,需要在后面加一个"?"
"""
"""
7.在正泽表达式中加()表示输出()里面匹配到的值
8.join:
格式:
str1.join(可迭代对象)
str1:是作为凭借的字符
"""
str3 = "a1b2c3d4"
L3 = re.findall("\d",str3)
L31 = "".join(L3)
print(L31)
str4 = input("请输入一个字符串:")
L4 = re.findall("[A-Za-z]",str4)
L41 = "".join(L4)
print(L41)
str5 = "a1b2c3d4"
L5 = re.findall("[A-Za-z]",str5)
L51 = "".join(L5)
print(L51)
三、正则训练题
"""
1.匹配出文字的阅读次数:"阅读次数为 9999"
2.找出各个编程语言的阅读次数: "python = 9999,c = 7890, c++ = 12345"
3.将Python的阅读次数加10 : "python = 997"
4切割字符"info:xiaozhang 33 shandong" 以:或者| 切割
"""
str1 = "阅读次数为 9999"
L1 = re.findall("[0-9]+",str1)
print(L1)
str2 = "python = 9999,c = 7890, c++ = 12345"
L2 = re.findall("[^=, ,0-9]+",str2)
L21 = re.findall("[0-9]+",str2)
print(L2)
print(L21)
str3 = "python = 997"
L3 = re.sub("\d+","1007",str3)
print(L3)
str4 = "info:xiaozhang 33 shandong"
L4 = re.split(":| ",str4)
print(L4)
"""
1.从键盘输入十个字符,判断是否有五个连续的数字
2.找出一个字符串中的五个连续数字,随后必须是非数字
3.把a1b2c3d4取数字内容拼接成一个字符串.
4.找出从键盘输入的字符串的所有字母
5.将a1b2c3d4字符内容拼接成一个字符串
"""
import re
str1 = input("请输入十个字符:")
for i in [0,1,2,3,4,5]:
if re.findall('\S+[0][1][2][3][4]\S+',str1) != []:
print("存在五个连续数字:01234")
elif re.findall('\S+[1][2][3][4][5]\S+',str1) != []:
print("存在五个连续数字:12345")
elif re.findall('\S+[2][3][4][5][6]\S+',str1) != []:
print("存在五个连续数字:23456")
elif re.findall('\S+[3][4][5][6][7]\S+',str1) != []:
print("存在五个连续数字:34567")
elif re.findall('\S+[4][5][6][7][8]\S+',str1) != []:
print("存在五个连续数字:45678")
elif re.findall('\S+[5][6][7][8][9]\S+',str1) != []:
print("存在五个连续数字:56789")
else:
print("不存在五个连续数字:")
str2 = input("请输入一串字符:")
L2 = re.findall("\D{1}(\d{5})\D{1}",str2)
print("这五个数字为:%s"%L2)