day9-正则表达式

时间:2021-10-25 09:37:11
正则表达式:是对字符串操作的一种逻辑公式

在字符函数的基础上添加相应的扩展函数

  函数:  pattern:规则  string:匹配字符串  flags:工作方式
findall(pattern, string, flags=0):查找所有匹配的内容
search(pattern, string, flags=0):匹配整个字符串,直到找到第一个匹配。
match(pattern, string, flags=0): 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None==》group(num) 
或 groups() 匹配对象函数来获取匹配表达式。
sub(pattern, repl, string, count=0, flags=0):替换 count替换次数
eg:r=re.sub("g.t","have","I get.A ,I got.B,I got.C",2)
print(r)
结果:I have.A ,I have.B,I got.C
compile(pattern, flags=0) 把规则写入对象中,通过调用对象实现
实例:text ="JGood is a b,he is cool"
regex=re.compile(r"\w*oo\w*")
text1=re.findall(r"\w*oo\w*",text)
print(regex.findall(text))
print(text1)
结果:['JGood', 'cool']
['JGood', 'cool']
split(pattern, string, maxsplit=0, flags=0):分割字符串 
finditer(pattern, string, flags=0) :返回对象地址
  search和match函数方法:
group() 返回被re匹配的字符串
start() 返回匹配开始的位置
end()   返回匹配结束的位置
span()  返回一个元组包含匹配(开始,结束)的位置
group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组的内容
eg:re.search("([0-9]*)(a-z)*","123abc").group(1) 默认取全部
  工作方式:
  re.I :使匹配对大小写不敏感
re.L :做本地化识别(locale-aware)匹配
re.S :使【.】匹配包括换行在内的所有字符
re.U :根据Unicode字符集解析字符,这个标志影响 \w \W,\b
re.X :该标志通过给予你更灵活的格式以便你将正则表达式写得更好
re.M :【^$】标志将会匹配每一行,默认【^】只会匹配符合正则的第一行
字符匹配
    普通字符:
大多数字符和字母都会和自身匹配
    元字符:
.  ^  $  *  +  ?  { }  |  ()  \

【.】通配符:只匹配一个字符
实例:re.findall("ABC.w","ABCaw123")
结果:["ABCaw"]
【^】:匹配的内容必须在开始位置
实例:re.findall("^ABC","ABCaw123")
结果:["ABC"]
【$】:匹配的内容必须在结尾位置
实例:re.findall("ABC$","alexaw123ABC")
结果:["ABC"]
【*】:贪婪匹配,匹配零至多个
实例:re.findall("AS*","A123ASS000AAS")
结果:['A', 'ASS', 'A', 'AS']
【+】:贪婪匹配,匹配一至多个
实例:re.findall("AS+","A123ASS000AAS")
结果:['ASS', 'AS']
【?】:贪婪匹配,匹配?前一个字符
实例:re.findall("AS?","A123ASS0000AAS")
结果:['A', 'AS', 'A', 'AS']
----------------贪婪匹配符中加?,变成最小匹配内容-----------------
【{ }】:贪婪匹配,匹配括号区间 (开区间)
实例1:re.findall("AS{3}","A123ASS0000AASASSS")
结果:['ASSS']
实例2:re.findall("AS{0,3}","A123ASS0000AASASSS")
结果:['A', 'ASS', 'A', 'AS', 'ASSS']

【[ ]】:字符集,在区间内的字符可匹配
实例1:re.findall("AS[abc]","asASaAas")
结果:['ASa']
【\】:反斜杠后边跟元字符去除特殊功能
反斜杠后边跟普通字符实现特殊功能
引用序号对应的自组所匹配的字符串
:\d 匹配任意十进制数  相当于[0-9]
 \D 匹配任意非数字字符,相当于[^0-9]
 \s 匹配任何空白字符;相当于【\t \n \r \f \v】
 \S 匹配任何非空白字符;相当于【^\t \n \r \f \v】
 \w 匹配任何字母数字字符;相当于【a-z A-Z 0-9】
 \W 匹配任何非字母数字字符;相当于【^a-z A-Z 0-9】
 \b 匹配一个单词边界,即指单词和空格间的位置  eg:\basd\b  查找中asd的单词
【()】:


   个别元字符可在[ ]内使用:
实例1:re.findall("[a-z]","asASaAas")  查找a到z的字符
结果:['a', 's', 'a', 'a', 's']
实例2:re.findall('[^a-z]','asASaAas')  查找除了a到z的字符
结果:['A', 'S', 'A']
实例3:re.findall('[\d]','asASaAas123')  查找除了a到z的字符
结果:['1', '2', '3']


按组来匹配:re.search(r"(alex)(eric)com\2","alexericcomericeric}").group()
结果:alexericcomeric






一些疑问:
   1.re.findall(r"a(\d)","a23b")  表达式中的 r 代表原生字符串
正则表达式里使用"\"作为转义字符,而我们需要匹配文本中的字符“\”
则需要进行转义“\\”,而r可以直接使用“\”
===》在python中,【\】需要进行转义【\\】,转义后的【\】重新赋予给正则表达式
则又需要进行转义【\\】,所以则需要【\\\\】
加上了r后代表原生字符串:则只需【\\】
===>相当于先通过python,再通过正则表达式的
 eg:
s1=r"a\tb"
s="a\tb"
print(s1)
print(s)
结果:a\tb
a b
   2.在ascall中\n 是换行   \r 回车   无\d含义
   3.findall优先捕获组内容
实例:r=re.findall("www.(baidu|youku).com","as www.baidu.com")
r1=re.findall("www.(?:baidu|youku).com","as www.baidu.com")  #去除优先捕获组内容
print(r)
print(r1)
------------正则运算---------
#"\([^()]+\)" 最里的括号
#"([*/]|\*\*)"乘除
#"\d+\.?\d*" 浮点型
#"[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*" 加
#"[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*" 减