Python正则表达式
1.re模块
需要先导入re
模块
import re
使用正则表达式:
有两种函数
re.compile()
:
demo1 = re.compile('[0-9]+?')
demo2 = re.compile('^[0-9]+?$')
test1 = demo1.findall(strs) # strs为要查找的字符串
test2 = demo2.findall(strs)
re.match(参数一,参数2)
参数一:正则表达式
参数二:所要使用的字符串
demo3 = re.match('[0-9]+?', strs)
demo4 = re.match('^[0-9]+?$', strs)
- demo1和demo2的唯一差距就是 ^ 与 $,^代表起始位置,$代表结束位置
举例说明:
strs = '123456abc'
demo5 = re.compile('^[0-9]+')
demo6 = re.compile('[0-9]+$')
demo7 = re.compile('^[0-9]+$')
demo8 = re.compile('^[0-9]+abc$')
demo5:^ 会检查第一个字符是否为数字,符合了则返回数字,不符合则返回空
demo6:$ 会检查最后一个字符是否为数字,符合则返回数字,不符合则返回空
demo7:首尾都加了^与$,则会检查整个字符是否完全符合正则表达式,是则返回匹配数据,不是则返回空
结果:
# demo5
123456
# demo6
''
# demo7
''
# demo8
123456abc
- 一个正则表达式由三个阶段组成 [0-9]+?
[0-9]
:所要选取的数据范围
+
:要取多少个,+号表示取一个(只有一个的话)或多个(多个且连续)
?
:使用什么模式 默认是贪婪模式,加了?之后会变为非贪婪模式
2.正则的相关参数 第一个部分
2.1 提取数字\d
与 提取非数字\D
举例:字符串strs = ‘123123 asdf rrr \n 123’
贪婪模式取数
demo = re.compile('\d+')
结果:
['123123', '123'] # 此处为贪婪模式
非贪婪模式取数
demo = re.compile('\d+?')
last = demo.findall(strs)
结果:
['1', '2', '3', '1', '2', '3', '1', '2', '3'] # 非贪婪模式
取非数字:
demo = re.compile('\D+')
2.2 提取数字,字母,下划线和汉字\w
,反向提取\W
strs = '123123 asdf rrr \n 123'
demo = re.compile('\w+')
last = demo.findall(strs)
结果:
['123123', 'asdf', 'rrr', '123']
# \n是换行字符
2.3 提取空白字符 \s
strs = '123123 asdf rrr \n 123'
demo = re.compile('\s+')
last = demo.findall(strs)
print(last)
结果:
[' ', ' ', ' \n ']
2.4 使用自己指定的规则 []
举例:
1.匹配字母a-z,大写字母A-Z,下划线_
demo = re.compile('[a-zA-z_]+')
2.匹配数字
demo = re.compile['[0-9]+']
3.匹配中文字符
提取中文:\u4E00-\u9FA5
demo = re.compile('[\u4E00-\u9FA5]+')
4.匹配[]内选中以外的其他字符
^
在[]
里可以反向取值
选取出除小写字母a-z,大写字母A-Z,下划线_,空格\s,中文\u4E00-\u9FA5的其他字符
demo = re.compile('[^a-zA-Z0-9_\s\u4E00-\u9FA5]+')
2.5 匹配所有元素 .
strs = '123123 asdf rrr \n 123'
deom = re.compile('.+')
结果:
其中换行符\n
没有囊括进来,要想包括则需要在re.compile加上一个参数
['123123 asdf rrr ', ' 123']
deom = re.compile('.+', re.S) # 将换行符转变为正常字符
3.正则的相关参数 第二个部分
本部分都是用字符串strs
strs = '123123 asdf rrr \n 123'
3.1 +
(常用)
+号代表:
只有一个数字(提取一个)
有多个数字(提取多个,一直取到没有数字为止)
demo = re.compile('\d+')
last = demo.findall(strs)
结果:
['123123', '123']
3.2 *
代表0个或多个
不是选取范围内的字符,用' '
代替
demo = re.compile('\d*')
结果:
['123123', '', '', '', '', '', '', '', '', '', '', '', '', '123', '']
3.3 {}
自定义选中的范围
举例一:
提取的数字只有范围大于等于2,小于等于4才能被选取
demo = re.compile('\d{2,4}')
结果:
['1231', '23', '123']
举例二:
提取的数字只有范围大于等于2 才能被选取
demo = re.compile('\d{2,}')
结果:
['123123', '123']
举例三:
按两个字符来选取
demo = re.compile('\d{2}')
结果:
['12', '31', '23', '12']
4.正则的相关参数 第三个部分
设定正则表达式所使用的模式,有贪婪模式和非贪婪模式
默认为贪婪模式
4.1 设定非贪婪模式 ?
demo = re.compile('\d+?')
贪婪模式与非贪婪模式差别:
demo1 = re.compile('\d+')
demo2 = re.compile('\d+?')
结果:
demo1
贪婪模式
['123123', '123']
demo2
非贪婪模式
['1', '2', '3', '1', '2', '3', '1', '2', '3']
5.()
关键字
加入()之后,正则表达式只会显示出()里要求显示的字符,其他字符作为找到该字符的参照物
举例:
strs = '1231234 asdf rrr \n 123'
显示出234 和 rrr之间的数据:
demo = re.compile('234([a-z ]+)rrr')
结果:
[' asdf ']
6.|
或符号
A|B可以匹配A或B,所以(P|p)ython
可以匹配’Python’或者’python’。
若前者匹配到了,则后者返回’‘空
若后者匹配到了,则前者返回’'空
strs = '1231234 asdf rrr \n 123'
使用或匹配,若前者符合则返回[a-z ]+
若后者符合,则返回(. *),代表选择所有字符
demo1 = re.compile('234([a-z ]+)rrr| rr(.*)123', re.S)
demo2 = re.compile('23([a-z ]+)rrr| rr(.*)123', re.S)
前者符合结果:
# demo1
[(' asdf ', '')]
后者符合结果:
# demo2
[('', 'r \n ')]
测试题
测试题一 :查找Email名字
def name_of_email(addr):
demo1 = re.compile('(<([0-9a-zA-Z. ]+)>.*?@\w+\.org)|(([0-9a-zA-Z.]+)@\w+\.org)') # (()|()) 显示出来会有四个值
# 第一个值(<([0-9a-zA-Z. ]+)>.*?@\w+\.org) 这一个符合的整体
# 第二个值 <([0-9a-zA-Z. ]+)>.*?@\w+\.org 只显示括号里的数据,其他的为方便参考
# 第三个值 (([0-9a-zA-Z.]+)@\w+\.org) 这一个符合的整体
# 第四个值 ([0-9a-zA-Z.]+)@\w+\.org 只显示括号里的数据,其他方便参考
demo = re.compile('<([0-9a-zA-Z. ]+)>.*?@\w+\.org|([0-9a-zA-Z.]+)@\w+\.org')
# 若前者符合,则后者为空
# 若后者符合,则前者为空
last = demo.findall(addr)
print(last)
if last[0][0] == '':
return last[0][1]
else:
return last[0][0]
测试:
# 测试:
assert name_of_email('<Tom Paris> tom@voyager.org') == 'Tom Paris'
assert name_of_email('tom@voyager.org') == 'tom'
print(name_of_email('<Tom Paris> tom@voyager.org'))
print('ok')
测试题二 :检查是否是Email
def is_valid_email(addr):
demo = re.compile(r'[0-9a-zA-Z.]+@\w+.com')
# 在字符串前加r,可以忽略转义字符
last1 = demo.match(addr)
print(last1)
return last1
测试:
assert is_valid_email('someone@gmail.com')
assert is_valid_email('bill.gates@microsoft.com')
assert not is_valid_email('bob#example.com')
assert not is_valid_email('mr-bob@example.com')
print('ok')