复习正则表达式20190618
python中的正则表达式大致分为以下几个部分:
1、元字符
2、模式
3、函数
4、re 内置对象用法
5、分组用法
6、环视用法
Python处理正则表达式的模块是re模块
一、元字符
一般字符(匹配自身)
. 匹配任意字符(不包括换行符),在DOTALL模式下可以匹配换行符
\ 转义一个特殊的字符,是这个字符表示原来字面上的意思。如\\.匹配.
预定义字符集
[...] 匹配括号中出现的任意单个字符
[^...] 不批括号中列出的单个字符(注意只能针对单个字符)
\d 匹配任意一个数字,范围为[0-9]
\D 匹配任意一个非数字,等价于[^0-9]
\s 匹配任意一个空白字符:[<空格>\t\r\n\v\f]
\S 匹配任意一个非空白字符,等价于[^\s]
\w 匹配任意一个字母、数字、下划线
\W 不匹配任意一个字母、数字、下划线,等价于[^\w]
数量字符集
^ 匹配开始位置,多行模式下匹配每一行的开始
$ 匹配结束位置,多行模式匹配每一行的结束
* 匹配0次1次或多次
+ 匹配1次或多次
? 匹配0到1次
{m} 匹配前一个字符m次
{m,n} 匹配前一个字符m到n次
{m,} 匹配前一个字符最少m次
{,n} 匹配前一个字符0到n次,最多n次
\A 仅匹配字符串的开始
\Z 仅匹配字符串的结束,如果存在换行,只匹配到换行之前的前的结束字符
\b 匹配一个单词的边界,也就是单词和空格之间的每一行结尾
\B [^\b]表示匹配非单词边界
|(或) |或匹配符,表达左右正则表达式任意匹配一个。如果左边的表达式匹配上了,匹配结束,不再
匹配右便的表达式。改符号一般放在()中使用,如果没在()中使用则它的范围是整个表达式
分组
(...) 向后引用。用()括起来的正则表达式被作为一个分组,从正则表达式的左边一次算起,右多少
个‘(’,就有多少个分组,分组的编码从1 开始一次加1,无论是括号中嵌套括号,并且作为分
组表达式作为一个整体,后可接数量词
\<num> 引用分组匹配到的分组编号为<num>的字符串
二、模式
正则表达式的模式是可以同时使用多个的,python里面使用|同时添加多个模式
re.I 忽略大小写匹配模式
re.L 字符集本地化
re.M 多行匹配
re.S 此模式下.可以匹配任意字符,包括换行符
re.U 根据Unicode字符集解析字符。这个标志影响:\w \W \b \B \s \S \d \D
re.X 此模式忽略正则表达式中的空白和#号的注释,常用于匹配邮箱的正则表达式
三、函数
re.complie(pattren,flags=0)
给定一个正则表达式pattern,制定使用模式flags默认是0,即不适用任何模式
例子:
import re
pattern = re.compile(r"hello")
rege = pattern.match("hello wordld!")
print(rege)
re.match(pattern,string,flags=0)
从开始位置匹配,匹配成功,则匹配到了,否则匹配失败
re.search()
从任意位置开始匹配,第一次匹配成功了,就不会往下匹配了
re.findall()
匹配整个字符串,匹配成功返回一个列表,匹配失败返回一个空的列表
re.finditer()
与findall一样,不同之处在于findall是返回一个列表,finditer返回一个迭代器
re.split(pattern,string,maxsplit=0,flags=0)
参数maxsplit制定切割次数,函数使用正则表达式寻找字符串的位置,返回切割后的字符串列表,匹配不成功,则返回原字符串列表
re.sub(pattern,repl,string,count=0,flags=0)
替换函数,将正则表达pattern匹配到的字符换替换为repl制定的字符串,参数count指替换的最大次数
练习题:
s = 'sunck ! is a good man!' import re print(re.split(r" +",s)) print(re.split(r"!",s)) print(s.split()) s1 = 'sunck is a good man!sunck is a nice man!sunck is a handsome man' d = re.finditer(r"sunck",s1) while 1: try: i =next(d) print(d) except StopIteration as e: break
'''
字符串的替换、修改
sub(pattern.repl.string.count = 0,flags = 0) 返回一个被替换h后的字符串
subn(pattern,repl,sting,count = 0.flage = 0) 返回一个元组,第一个被替换后的字符串,第二个是替换的次数
'''
s3 = 'sunck is a good good good man!' print(re.sub(r"good","nice",s3)) print(re.subn(r"good","nice",s3)) ''' 分组group() ''' s4 = '010-63214569' m = re.match(r"(\d{3})-(\d{8})",s4) print(m.group()) print(m.group(1)) print(m.group(2))
"""
写一个函数匹配字符串中的5个数字
"""
import re def test_regular(destine_string): result = re.search(r"\D\d{5}\D|^\d{5}\D|\d{5}$|^\d{5}$",destine_string) if result: word_list=[] for s in result.group(): if s in '0123456789': word_list.append(s) print("".join(word_list)) return "".join(word_list) else: print("NOT find") return "NOT find" if __name__=="__main__": test_data = ["12345","avcd12345","12345ww","abc12345qw"] for data in test_data: #assert test_regular(data) =="12345" #assert test_regular('12345')=="12345" #assert test_regular('x12345') == "12345" #assert test_regular('12345qq') == "12345" #assert test_regular('12345') == "12345" assert test_regular('vvv12345qq') == "12345"
"""
提取字符串中所有的有效的域名地址
"""
add = 'https://www.net.com.edu//action=?asdfsd and other ' import re res = re.findall(r"((w{3}\.)(\w+\.)+(com|edu|cn|net))",add1) print(res)