python基础学习浅学正则表达式

#########################################第一部分:正则表达式概念

正则表达式所面向的问题
1、判断一个字符串是否匹配给定的格式
判断用户注册帐号是否满足格式
2.从一个字符串中按指定格式提取信息
抓取页面中的链接

#########################################第二部分:re模块
在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块来操作,名字为re

1、findall方法:
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表

2、match方法:(从开头开始匹配)
re.match 尝试从字符串的起始位置匹配一个模式,匹配成功
返回的是一个匹配对象(这个对象包含了我们匹配的信息),
如果不是起始位置匹配成功的话,match()返回的是空,
注意:match只能匹配到一个

来个例子看看:
import re

str_3 = ‘寒沙你是中国最帅的男人’
my_str = re.match(r’最帅的男人’,str_3) #匹配不成功的例子
print(my_str) # 输出为:None

my_str = re.match(r’寒沙’,str_3) #匹配成功的例子
print(my_str) # 匹配成功,但是这个方法成功的时候返回的是对象,需要使用其方法
print(my_str.group()) # 输出为:寒沙老师
print(my_str.span()) #输出为:(0, 2),匹配的字符在字符串内的位置,区间形式
print(my_str.start()) #输出为:0, 匹配的字符串在字符串中的起始位置
print(my_str.end()) #输出为:2, 匹配的字符串在字符串中的结束位置

拓展一个:
分组:
import re

str_4 = ‘aababbabbb’

my_str = re.match(r’(a)(ab)(abb)(abbb)’,str_4)
print(my_str.group()) # 输出为:aababbabbb
print(my_str.groups()) # 输出为:(‘a’, ‘ab’, ‘abb’, ‘abbb’)

print(my_str.group(0)) # 输出为:aababbabbb
print(my_str.group(1)) # 输出为:a
print(my_str.group(2)) # 输出为:ab
print(my_str.group(3)) # 输出为:abb

3、search方法:(从任意位置匹配)
re.search 扫描整个字符串,匹配成功 返回的是一个匹配对象(这个对象包含了我们匹配的信息)
注意:search也只能匹配到一个,找到符合规则的就返回,不会一直往后找

来个例子看看:
import re

str_3 = ‘寒沙你是中国最帅的男人’
my_str = re.search(r’最帅的男人’,str_3)
print(my_str.group()) # 输出为:最帅的男人
#也可以使用match的那些方法

4、sub方法 替换
str_3 = ‘吴某你好帅,吴某喜欢吃屎’
my_str = re.sub(r’吴某’,‘张某’,str_3,count = 2) # count 限制修改的次数
print(my_str) # 输出为:张某你好帅,张某喜欢吃屎

4、split方法 切割
str_3 = ‘寒沙你是中国最帅的男人寒沙你真棒’
my_str = re.split(r’寒沙’,str_3)
print(my_str) #输出为:[’’, ‘你是中国最帅的男人’, ‘你真棒’]

##########################################第三部分:元字符

问题一: 什么是元字符 ?
本身具有特殊含义的字符

import re


第一个例子说明一些元字符:::
str = ‘寒沙老帅你真棒寒沙老帅你真胖’
######(1) . 代表任意一个字符(除了\n)
mystr = re.findall(r’.’,str) # 输出为:[‘寒’, ‘沙’, ‘老’, ‘帅’, ‘你’, ‘真’, ‘棒’,
print(mystr) # ‘寒’, ‘沙’, ‘老’, ‘帅’, ‘你’, ‘真’, ‘胖’]

mystr = re.findall(r’寒沙.’,str) # 输出为:[‘寒沙老’, ‘寒沙老’]
print(mystr)

#####(2) [] 匹配[]中列举的字符
mystr = re.findall(r’[老帅你]’,str)
print(mystr) # 输出为:[‘老’, ‘帅’, ‘你’, ‘老’, ‘帅’, ‘你’]

#####(3) 以^开头,以KaTeX parse error: Expected 'EOF', got '#' at position 4: 结尾 #̲####(4) {a,b}…’,str) # 这样取不到,因为字符串不是以‘寒沙.’开头,且以‘胖’结尾
print(mystr) # 输出为:[]

mystr = re.findall(r’胖$’,str)
print(mystr) # 输出为:[‘胖’]

mystr = re.findall(r’^寒沙.{1,100}胖$’,str)
print(mystr) # 输出为:[‘寒沙老帅你真棒寒沙老帅你真胖’]

#####(5) \b 匹配一个单词的边界; \B 匹配非单词边界。
mystr = re.findall(r’\b寒沙’,str) # 因为只有第一个寒沙左边是边界,所以只会匹配第一个寒沙
print(mystr) # 输出为:[‘寒沙’]

str = ‘寒沙?老帅你真棒,寒沙。老帅你真胖’
mystr = re.findall(r’\b寒沙\b’,str)
print(mystr) # 输出为:[‘寒沙’, ‘寒沙’]

str = ‘寒沙老帅你真棒寒沙,老帅你真胖’
mystr = re.findall(r’\B寒沙\b…’,str)
print(mystr) #输出为:[‘寒沙,老’]

第二个例子说明一些元字符:::
#+ 至少一个:匹配前一个字符出现1次或者无限次
#?至多一个:匹配前一个字符出现1次或者0次,即要么有1次,要么没有
#* 0到任意一个:匹配前一个字符出现0次或者无限次,即可有可无

str = ‘aababbabbb’
my_str = re.findall(r’ab+’,str)
print(my_str) # 输出为:[‘ab’, ‘abb’, ‘abbb’]

my_str = re.findall(r’ab?’,str)
print(my_str) # 输出为:[‘a’, ‘ab’, ‘ab’, ‘ab’]

my_str = re.findall(r’ab*’,str)
print(my_str) # 输出为:[‘a’, ‘ab’, ‘abb’, ‘abbb’]

拓展:
贪婪模式和非贪婪模式:
正则默认都是用贪婪模式去匹配数据的,就是尽可能多的匹配符合要求的数据,在非贪婪模式下(使用非贪婪模式,要加?),始终找最短匹配

例如上面的例子变为非贪婪模式:
str = ‘aababbabbb’
my_str = re.findall(r’ab+?’,str)
print(my_str) # 输出为:[‘ab’, ‘ab’, ‘ab’]

my_str = re.findall(r’ab??’,str)
print(my_str) # 输出为:[‘a’, ‘a’, ‘a’, ‘a’]

my_str = re.findall(r’ab*?’,str)
print(my_str) # 输出为:[‘a’, ‘a’, ‘a’, ‘a’]


第三个例子说明一些元字符:
import re

str_2 = ‘qdasfsdf32423542dasff’

#(1) 全部取到的方法:
my_str = re.findall(r’[a-z0-9]+’,str_2)
print(my_str) # 输出为:[‘qdasfsdf32423542dasff’]

#(2) ^ 非,相反的意思 脱字符
my_str = re.findall(r’[0-9]+’,str_2)
print(my_str) # 输出为:[‘32423542’]

my_str = re.findall(r’[^0-9]+’,str_2)
print(my_str) # 输出为:[‘qdasfsdf’, ‘dasff’]

#(3) \d 匹配数字,即0-9
my_str = re.findall(r’\d+’,str_2)
print(my_str) # 输出为:[‘32423542’]

#(4) \D 匹配非数字,即不是数字
my_str = re.findall(r’\D+’,str_2)
print(my_str) # 输出为:[‘qdasfsdf’, ‘dasff’]


第四个例子说明一些元字符:
import re

str_2 = ‘asdfsd\n432 4sfs吴某’

#(5) \s 匹配空白,即空格,Tab键
my_str = re.findall(r’\s+’,str_2)
print(my_str) # 输出为:[’\n’, ’ ']

#(5) \S 匹配非空白
my_str = re.findall(r’\S+’,str_2)
print(my_str) # 输出为:[‘asdfsd’, ‘432’, ‘4sfs吴某’]

#(6) \w 任意一个字母(注意会取中文) 0-9,a-z,A-Z
my_str = re.findall(r’\w+’,str_2)
print(my_str) # 输出为:[‘asdfsd’, ‘432’, ‘4sfs吴某’]

#(7) \W 任意非字符
my_str = re.findall(r’\W+’,str_2)
print(my_str) # 输出为:[’\n’, ’ ']

#(8) | 或者
my_str = re.findall(r’a|d’,str_2)
print(my_str) # 输出为:[‘a’, ‘d’, ‘d’]


第五个例子说明一个元字符:
import re

str_2 = ‘吴某同学好帅’

#(9) () 只取括号里的 将括号中字符作为一个分组
my_str = re.findall(r’吴某同学(好帅)’,str_2)
print(my_str) #输出为:[‘好帅’]

发布了14 篇原创文章 · 获赞 15 · 访问量 222

猜你喜欢

转载自blog.csdn.net/qq_44907926/article/details/104351111