\w+@zhengzetang\.com
,其中\w+
、\.
属于元字符;@zhengzetang
、com
是普通字符。\w+@zhengzetang\.com
为例w
字符不表示英文字母w,而是表示任何语言的单词字符、数字或下划线等内容时,需要在w前面加上反斜杠“\”。.
本身是基本元字符,代表任意一个字符,但是我们希望按照.
字面的意义使用(就是一个点),这时候加上一个反斜杠“\”就可以实现了。\
就是对普通字符或基本元字符,进行转义,用于其他功能。^
和$
,用以匹配一行字符串的开始和结束。^
开始时,要求一行字符串的开始位置匹配。$
结束时,要求一行字符串的结束位置匹配。import re
p1 = r'\w+@tianshangrenjian\.com'
p2 = r'^\w+@tianshangrenjian\.com$'
text = "My email is [email protected]."
m = re.search(p1, text)
print(m)
# 匹配不到,有^,$符号,匹配时要求text字符串开始和结束都要与正则表达式开始和结束匹配。
a = re.search(p2,text)
print(a)
# email字符串的开始与结束与正则表达式相匹配
email = '[email protected]'
b = re.search(p2, email)
print(b)
[]
元字符类。例,想在字符串中匹配java或Java,可以使用正则表达式[Jj]ava
import re
p = r'[Jj]ava'
# 可以匹配
m = re.search(p, 'i like Java and Python')
print(m)
# 可以匹配
c = re.search(p, 'i like java and Python')
print(c)
# 不可匹配
b = re.search(p, 'i like JAVA and Python')
print(b)
# 想要匹配JAVA,可以使用|
p2 = r'java|JAVA|Java'
d = re.search(p2, 'i like JAVA and Python')
print(d)
^
符号。import re
p = r'[^0123456789]'
# 不匹配数字
m = re.search(p, '239120392')
print(m)
# 除了非数字外,都可以匹配任意字符
a = re.search(p, 'Reasdskf')
print(a)
[^0123456789]
,较为复杂,可以使用区间符号-
表示。即[^0123456789]
等同于[^0-9]
[a-z]
,大写[A-Z]
。[A-Za-z0-9]
表示所有字母和数字字符类,[0-25-7]
表示0,1,2,5,6,7import re
p = r'[a-zA-Z0-9]'
# 匹配
m = re.search(p, 'A10.3')
print(m)
# 不匹配
a = re.search(r'[0-25-7]', 'A3489C')
print(a)
[0-9]
等,为了书写方便,正则表达式提供了预定义的字符类。import re
# p = r'[^0123456789]'
p = r'\D'
# 不匹配
m = re.search(p, '11003')
print(m)
# 匹配
a = re.search(p, 'ajdka')
print(a)
text = "hello world。"
b = re.search(p, text)
print(b)
字符 | 说明 |
---|---|
? |
出现零次或一次 |
* |
出现零次或多次 |
+ |
出现一次或多次 |
{n} |
出现n次 |
{n, m} |
至少出现n次但不超过m次 |
{n, } |
至少出现n次 |
import re
m = re.search(r'\d?', '87654321') # 出现数字一次,匹配字符8
print(m)
a = re.search(r'\d?', 'adxcx') # 出现数字0次,匹配''
print(a)
b = re.search(r'\d*', '2134354afas123') # 出现数字多次,匹配2134354
print(b)
c = re.search(r'\d{8}', '87654321') # 出现数字8次,匹配87654321
print(c)
d = re.search(r'\d{9,}', '87654321') # 出现数字8次,但要求9次,不匹配
print(d)
?
import re
# 使用贪婪量词
m = re.search(r'\d{5,8}', '87456123') # 至少出现5次,不少于8次,贪婪匹配8次
print(m)
# 使用懒惰量词
a = re.search(r'\d{5,8}?', '87456123') # 懒惰匹配5次
print(a)
对正则分组不仅可以对一个字符串整体使用量词,也可以在正则中引用已存在的分组。
示例
import re
p = r'(121){2}'
m = re.search(p, '121121121adfd') # 匹配121121
print(m)
print(m.group()) # 返回匹配的字符串
print(m.group(1)) # 返回第一组内容
a = r'(\d{3,4})-(\d{7,8})'
b = re.search(a, '010-7785457322a')
print(b)
print(b.group())
print(b.group(1))
?P<分组名>
import re
p = r'(?P\d{3,4})-(?P\d{7,8})'
b = re.search(p, '010-77548573')
print(b)
print(b.group())
print(b.groups())
# 通过组编号返回
print(b.group(1))
print(b.group(2))
# 通过组名返回
print(b.group('area_code'))
print(b.group('phone_code'))
import re
p = r'<([\w]+)>.*([\w]+)>'
m = re.search(p, 'abc')
print(m)
a = re.search(p, 'erd')
print(a)
与
不一样,因此上述正则不能实现我们想要的结果。如果把第二个分组改成反向引用第一组,即可实现,组编号都是从1开始的,反向引用语法为:\组编号
。import re
p = r'<([\w]+)>.*(\1)>'
m = re.search(p, 'abc')
print(m)
a = re.search(p, 'erd')
print(a)
?:
import re
s = 'img1.png, img2.png, img3.jpg, img4.png'
# 捕获分组,将括号中的内容作为子表达式进行捕获匹配,将组的内容返回
p1 = r'\w+(\.png)'
mlist = re.findall(p1,s)
print(mlist)
# 非捕获分组,将括号中的内容作为普通正则字符串进行整体匹配,即找到.png结尾的文本
p2 = r'\w+(?:\.png)'
nlist = re.findall(p2,s)
print(nlist)
search()
:在输入字符串中查找,返回第一个匹配内容,找到就匹配对象,没找到就返回None
。match()
:在输入字符串开始处查找匹配内容,找到就匹配对象,没找到就返回None
。import re
p = r'\w+@woaipython\.com'
text = 'my email is [email protected]'
# 能匹配
m = re.search(p,text)
print(m)
# 不能匹配
n = re.match(p,text)
print(n)
email = '[email protected]'
# 能匹配
a = re.search(p,email)
print(a)
# 能匹配
b = re.match(p, email)
print(b)
email = '[email protected]'
b = re.match(p, email)
print(b)
print(b.group())
print(b.start())
print(b.span())
print(b.end())
findall()
:在输入字符串中查找所有匹配内容,如果匹配成功,返回match列表对象,否则返回None。finditer()
:在输入字符串中查找所有匹配内容,如果匹配成功,返回容纳match的可迭代对象,通过迭代对象每次可以返回一个match对象,如果失败则返回None。import re
p = r'[Pp]ython'
text = 'i like python or Python.'
match_list = re.findall(p, text)
print(match_list)
match_iter = re.finditer(p, text)
for i in match_iter:
print(i)
print(i.group())
split()
,按照匹配的子字符串进行分割,返回字符串列表对象。re.split(pattern, string, maxsplit=0, flags=0)
import re
p = r'\d+'
text = 'ABCD12EF33gh'
clist = re.split(p, text)
print(clist)
dlist = re.split(p, text, maxsplit=1)
print(dlist)
elist = re.split(p, text, maxsplit=2)
print(elist)
re.sub(pattern, repl, string, count=0, flags=0)
import re
p = r'\d+'
text = 'ABCD12EF33gh'
replace_text = re.sub(p, ' ', text)
print(replace_text)
replace_text = re.sub(p, ' ', text, count=1)
print(replace_text)
replace_text = re.sub(p, ' ', text, count=2)
print(replace_text)