正则表达式
一、正则基础
^
:匹配字符串的开头
$
:匹配字符串的末尾。
.
:匹配任意字符,除了换行。
[] : 用来表示一组字符,表示范围,单独列出:[amk] 匹配 ‘a’,‘m’或’k’
[^...]
:不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
*
:匹配0个或多个的表达式。
+
: 匹配1个或多个的表达式。
?
:匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{ n}
:匹配n个前面表达式。例如,"o{2}“不能匹配"Bob"中的"o”,但是能匹配"food"中的两个o。
{ n,}
:精确匹配n个前面表达式。例如,"o{2,}“不能匹配"Bob"中的"o”,但能匹配"foooood"中的所有o。"o{1,}“等价于"o+”。“o{0,}“则等价于"o*”。
{ n, m}
:匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b
:匹配a或b
(re)
:匹配括号内的表达式,也表示一个分组
\w
:匹配数字字母下划线
\W
:匹配非数字字母下划线
\s
:匹配任意空白字符,等价于 [\t\n\r\f]。
\S
:匹配任意非空字符
\d
:匹配任意数字,等价于 [0-9]。
\D
:匹配任意非数字
\A
:匹配字符串开始
\Z
:匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z
:匹配字符串结束
\G
:匹配最后匹配完成的位置。
\b
:匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B
:匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\n, \t
,: 匹配一个换行符。匹配一个制表符。
二、re模块
1、查找匹配
(1)re.match
re.match(r’正则表达式’,字符串):匹配字符串,若匹配成功则返回一个匹配对象,否则返回None。
re.match(pattern, string, flags=0):flags为标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
正则表达式中用()表示分组,用()括起部分在匹配成功后可通过group(n)获取对应的值。
import re
def re_demo(email):
response = re.match(r'^([\d\w\.]*)@([\d\w]*)\.[\w]{2,3}$', email)
if response:
print("匹配成功")
print(response.group(0))
print(response.group(1))
print(response.group(2))
else:
print("匹配失败")
re_demo('someone@gmail.com')
输出:
匹配成功
someone@gmail.com
someone
gmail
(2)re.search()方法
re.search(pattern, string, flags=0):扫描整个字符串并返回第一个成功的匹配。
def re_search(search_word):
response = re.search(r'(.*) are (.*)',search_word)
if response:
print(response.group())
print(response.group(1))
print(response.group(2))
else:
print("没找到啦")
re_search('hhh are ju')
输出:
hhh are ju
hhh
ju
re.match与re.search的区别:
re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。
2.替换
re.sub(pattern, repl, string, count=0, flags=0),返回替换后的字符串
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags : 编译时用的匹配模式,数字形式。
def re_sub(word):
response = re.sub(r'\d','',word)
print(response)
re_sub('1234hanqing3%#$@qing')
输出:
hanqing%#$@qing
3.预编译
re.compile()方法
python中使用正则时,re模块内部会处理两件事:
(1)编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
(2)用编译后的正则表达式去匹配字符串。
为了减少编译花费的时间,可以先采取预编译。
#编译
response = re.compile(r'正则表达式')
#使用
response.match(字符串)
4.切分字符串
re.split(r’正则表达式’,字符串),返回内容为一个切分后的字符串列表
def re_split(word):
print(re.split(r'[, ]+', word))
re_split('han,ew ew er,e')
输出:
['han', 'ew', 'ew', 'er', 'e']
5.查找全部
re.findall(string[, pos[, endpos]]):在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
re.findall(pattern, string, flags=0)
说明:
string 待匹配的字符串。
pos 可选参数,指定字符串的起始位置,默认为 0。
endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。
注意:match 和 search 是匹配一次 findall 匹配所有。
def re_findall(word):
print(re.findall(r'[\d\w]+', word))
re_findall('453yehfjd@2$dk%^&*fd')
输出:
['453yehfjd', '2', 'dk', 'fd']
re.finditer(pattern, string, flags=0):在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。