#模式匹配与正则表达式
自我理解 :让代码变得更加整洁,节约大量筛选时间的方法Regex。
#1 import re
创建正则表达式
re.compile(r" “) # 传入一个字符串值,表示正则表达式,他将返回一个Regex模式对象;(Regex对象)
匹配Regex对象
Regex 中的 search()方法查找传入的字符串,寻找该正则表达式的所有匹配;
import re
phone_num = re.compile(r”\d{3}-\d{3}-\d{4}")
mo = phone_num.search(“my number is 446-357-5187”)
print(“phone num found :”+ mo.group())
group()方法返回被查找字符串中实际匹配的文本
注意:向re.compile(r"")传递原始字符串
用正则表达式匹配更多模式
利用括号进行分组
phone_num = re.compile(r"(\d\d\d)-(\d\d\d-\d\d\d\d)")
mo = phone_num.search(“my number is 446-357-5187”)
mo.group(1)
“446”
如果想获得所有分组使用函数 groups()得到的是(“446”,“357-5187”)
也可以
area_code,main_number = mo.groups()
print (area_code)
print (main_number)
括号在正则表达式中有特殊的含义,如果你需要在文本中匹配括号,就需要用倒斜杠对进行字符转义((\d\d\d)) 即 (和)
则可以匹配实际的括号字符;
用管道"|“匹配多个分组
希望匹配许多表达式中的一个时应用
例 :bat_regex = r"a|b” mo = bat_regex.search(“b and a .”)
mo.group() -->b
bat_regex = r"b(a|b|c|d)" mo =bat_regex .search(“ba lost a wheel”) mo.group()–>ba
mo.group(1)–>a
如果需要匹配真的管道字符,就用倒斜杠转义,即|.
贪婪和非贪婪匹配
例 “HaHaHaHaHa” 中(Ha){3,5}可以匹配3-5个
当你利用group()方法时候; 会返回"HaHaHaHaHa" 而不是更短的结果。 说明python的regex 正则表达式是“贪心”的,
他会尽可能的匹配最长的字符串。
(即python 贪婪模式)
贪婪模式
mport re
data =re.compile( r"(Ha){3,5}?")
mo =data.search(“HaHaHaHaHa”)
print(mo.group())
“HaHaHaHaHa”
非贪婪模式
data = re.compile(r"(Ha){3,5}?")
mo =data.search(“HaHaHaHaHa”)
print(mo.group())
“HaHaHa”
findall()方法 注释:Match对象可以用group提取
与re中 search()方法不同,search()方法返回一个Match对象;
而findall()返回的是一组字符串;而不是Match 对象;
data = re.compile(r"\d\d\d-\d\d\d-\d\d\d\d")# has no groups
mo = data.findall(“cell:415-555-5168 work:212-515-3587”)
mo = [‘415-555-5168’,‘212-515-3587’]
如果正则表达式有分组?何为分组,方便记忆 group即为组
如果调用在一个有分组的正则表达式,方法findall()将返回一个字符串的"元组"的"列表".
data = re.compile(r"(\d\d\d)-(\d\d\d)-(\d\d\d\d)")# has no groups
mo = data.findall(“cell:415-555-5168 work:212-515-3587”)
mo = [(“415”,“555”,“5168”),(“212”,“515”,“3587”)]
字符分类
\d 0-9任何数字
\D 除了0-9的数字以外的任何字符
\w 任何字母、数字、下划线字符
\W 除了字母、数字、下划线字符
\s 空格 制表符 换行符 可以理解为"空白"字符
\S 除了空格、制表符、换行符以外的任何字符
[a-zA-Z0-9] 匹配所有字母的大小写及数字
用?实现可选匹配(wo)? wo将出现0次或者1次 如果真的需要匹配问号字符 则 ?
用实现可选匹配(wo) wo将出现0次或者多次 如果真的需要匹配星号字符 则 *
用+实现可选匹配(wo)+ wo将出现1次或者多次 如果真的需要匹配加号字符 则 +
用{}匹配特定次数 (haha){3,5} (haha){3,} (haha){0,5}
有时候你想匹配一组字符,但缩写的字符分类(\d \w \s等)太过宽泛,你可以用方括号定义自己的字符分类。
data = re.compile(r"[aeiouAEIOU]")
data.findall(“一段字符.”)
将匹配出所有元音字符不论大小写
data = re.compile(r"[^aeiouAEIOU]")
匹配出不在这个字符类中的所有字符"^"
插入字符和美元字符
在正则表达式开始处使用插入符号(^),表示匹配必须发生在被查找文本开始处。
在正则表达式末尾处使用插入符号(KaTeX parse error: Expected group after '^' at position 29: …查找文本末尾处。
Fe:
r"^̲\d+" 该正则表达式表示匹配以数字0-9开始到结束的字符串
通配字符
. (句点)
匹配除了换行以外的所有字符 句点字符只匹配一个字符
倒斜杠转义 .
用点-星匹配所有字符 (.)任意字符
(.)模式使用"贪心"模式,它总是匹配尽可能多的文本。要用"非贪心"模式匹配所有文本
即 (.?)
data = re.compile(r"<.?>")
mo = data.search(" for dinner>")
mo.group()
“”
data = re.compile(r"<.*>")
mo = data.search(" for dinner>")
mo.group()
" for dinner>"
用句点字符匹配换行
data = re.compile(r".*",re.DOTALL)
mo = data.search(r"a.\nb.\nc.")
mo.group()
“a.\nb.\nc”
正则表达式在创建没有像re.compile()中传入re.DOTALL,它将匹配所有字符,直到第一个换行字符。
如传入了则将匹配所有字符包括换行符。
不区分大小写的匹配
有时候匹配你只关心匹配字母例如验证码,不关心它们是大写还是小写,要让正则表达式不区分大小写,
就需要给compile()添加另外一个参数re.I 就可以实现匹配字符不分大小写
用sub()方法替换字符串
data = re.compile(r"Agent (\w)\w+")
data.sub(r’\1****’,‘Agent Alice told Agent Evel that Agent tracy know Agent lucy was a double agent.’)
管理复杂的正则表达式
匹配复杂的文本模式可能需要长的费解的正则,可以告诉re.compile()忽略正则表达式中的空白符和注释,从而缓解这一点
可以向re.compile()中传入参数re.VERBOSE
Fe:
data = re.compile(r"""(
(\d{3}|(\d{3}))? #area code
(\s|-|.)? #separator
\d{3} #first 3digits
(\s|-|.) # separator
\d{4} #last 4digits
(\s*(ext|x|ext.)\s*\d{2,5})? #extension
)""",re.VERBOSE
组合使用 re.I 、re.DOTALL 、re.VERBOSE
格式data = re.compile(r"[aeiouAEIOU]",re.I|re.DOTALL|re.VERBOSE)