(一)定义
正则表达式是对字符串(包括普通字符(例如,a 到 z之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符
1.“ . ”------------用法
importre
# '.'---匹配任意一个字符,除了(\n)
#match ---从头查找 *代表所有
ret=re.match('.*','fdsgfh')
print(ret)
2.” 【 】”--------用法
#[a-z]可以表示范围,[adsfd]--符合其中一个就可以
ret=re.match('[a-z]','adf')
print(ret)
print(ret.group())
3. \d---匹配数字 \D---匹配非数字
ret=re.match('\d','1adf')
print(ret)
print(ret.group())
#第二种
ret=re.match('\D','1BBdf')
print(ret)
print(ret.group())
4.\s--匹配空白 tab键 \S匹配非空白
ret=re.match('\s',' 1BBdf')
print(ret)
print(ret.group())
print('............................')
ret=re.match(r'\s','\t1BBdf')
print(ret)
print(ret.group())
print('................................')
ret=re.match(r'\S','1BBdf')
print(ret)
print(ret.group())
5.\w---匹配单词字符 \W---匹配非单词字符
#w---匹配单词字符 后面的re.A---限制只能使用ascii 码里的字符(除了中文)
ret=re.match('\w','中5cdf',re.A)
print(ret)
print(ret.group())
#'W'---匹配非单词字符---只能识别一些符号例如(),。
ret=re.match('\W','5cdf',re.A)
print(ret)
print(ret.group())
#但是后面加上re.A 可以识别中文
ret=re.match('\W','中5cdf',re.A)
print(ret)
print(ret.group())
6.[\u4e00-\u9fa5]----直接匹配中文
ret=re.match('[\u4e00-\u9fa5]','中国')
print(ret)
(二)---表示数量
1.‘*’
#"*"---只能取它前面的那个字符,尽可能的取到它出现的所有
ret=re.match('aw*','aawwdfs')
print(ret)
print(ret.group())
2.“ +”
# '+'---仅匹配它前面的一个字符,至少出现一次
# ret=re.match('aw+','aawwdfs')
# print(ret)
# print(ret.group())
#像以上代码会报错,因为a匹配到,但是w一次也没有
# ret=re.match('aaw+','aawwdfs')
# print(ret)
# print(ret.group())
3. “?”
#'?'---仅匹配它前面的一个字符,出现次数可以<=1
#所以它前面那个字符如果没有就不会报错
ret=re.match('aw?','aawwdfs')
print(ret)
print(ret.group()
4.{m} {m,} {m,n}
'{m}'---仅匹配它前面的一个字符,出现次数可以m次
ret=re.match('aaw{1}','aawwdfs')
print(ret)
print(ret.group())
'{m,}'---仅匹配它前面的一个字符,出现次数可以>m次
ret=re.match('aaw{2,}','aawwwdfs')
print(ret)
print(ret.group())
'{m,n}'---仅匹配它前面的一个字符,出现次数可以m
ret=re.match('aaw{2,5}','aawwwdfs')
print(ret)
print(ret.group())
(三)------边界
1.“ ^ ”
把“^”---写到列表里是除了哪些内容,剩下的
ret=re.match('[^a-z]','1aawwdfs')
print(ret)
print(ret.group())
2."$"
#$---限制字符以什么结尾 ^---跟match 相同
while True:
emil=input('--')
ret=re.search('^[a-zA-Z0-9]+@168.com$',emil)
print(ret)
3."\b"
#\b------匹配单词的边界
ret=re.match(r'who\b','who am i')
print(ret)
ret=re.match(r'who\s','who am i')
print(ret)
#假如说who后面有数不过来的空格
ret=re.match(r'who\b\s*','who am i')
print(ret)
#匹配中文的边界,注意边界字符串间一定要用空格隔开
ret=re.match(r'我\b','我 是谁')
print(ret)
#不加空格,返回的就是None
ret=re.match(r'我\b','我是谁')
print(ret)
(四)分组
#因为?前匹配可以是一个也可以是零个,所以把8分给\d
#在正则里面加小括号可以分组 从1开始
ret = re.match("([1-9]?)(\d)","8")
print(ret.group(1))
print(ret.group(2))
ret = re.match("([1-9]?)(\d)","80")
print(ret.group(1))
print(ret.group(2))
“ | ”------或者
"|"---表示或者,一般前面满足结果就是前面 第三种情况前面满足不了输出是None,所以结果是None
ret = re.match("[1-9]?\d$|100","8")
print(ret)
ret = re.match("[1-9]?\d$|100","78")
print(ret)
ret = re.match("[1-9]?\d$|100","08")
print(ret)
(五)高级用法
1.#compile函数用于编译正则表达式,生成一个 Pattern 对象
#用这个对象.match( )括号里只放字符串就好
pattern =re.compile('a+')
info='abbb'
ret=pattern.match(info)
print(ret)
2.search方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果
3.match如上,不过他是从头查找
4.findall
#findall
上面的 match 和 search 方法都是一次匹配,只要找到了一个匹配的结果就返回。然而,在大多数时候,我们需要搜索整个字符串,所以用findall获得所有匹配的结果,并生成列表
pattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('hello 123456 789')
# 0-10 确定范围
result2 = pattern.findall('one1two2three3four4', 0, 10)
print(result1)
print(result2)
5.finditer
# #finditer---和findall相似也是搜索整个字符串。不过最后可以生成一个迭代器
pattern = re.compile(r'\w+')
result2 = pattern.finditer('one1two2three3four4', 0, 10)
print(result2)
for i in result2:
print(i.group())
6.sub-----替换
info='hello 123,hello xiaocui'
ret=re.sub(r'(\w+) (\w+)',r'\2 \1',info)
print(ret)
7.split----分割
ret=re.split(':| +','sd:dsf Fds')
print(ret)
8.贪婪/非贪婪
#贪婪 程序默认为贪婪
s="This is a number 234-235-22-423"
ret = re.match(r"(.+)(\d+-\d+-\d+-\d+)",s)
print(ret)
print(ret.group())
print(ret.group(1))
print(ret.group(2))
s="This is a number 234-235-22-423"
ret = re.match(r"(.+?)(\d+-\d+-\d+-\d+)",s) #加?变为非贪婪
print(ret)
print(ret.group())
print(ret.group(1))
print(ret.group(2))
ret=re.match(r'(\w)+(\s)+','ask jh f kj')
print(ret)
print(ret.start())
print(ret.span(2))
print(ret.start(2))
print(ret.group(1))
print(ret.group(2))
网友评论