写在前面
python的re模块中有3个方法
- search(pattern, string, flags=0),在string中查找匹配pattern的字串,找到一个就会返回一个match对象,可以直接print返回的结果,也可以使用groups()来查看分组的情况。若是没有找到匹配,返回None。
- match(pattern, string, flags=0),查看string的开头部分是否匹配pattern,匹配的化就把匹配结果返回,也是一个match对象。若是没有找到匹配,返回None。
- matchall(pattern, string, flags=0),查看整个string是否匹配pattern,返回的情况和match方法是一样的
匹配URL
import re
# fullmatch,将regex应用到整个字串中
# 判断一个给定的字符串是否是合法的URL
fullmatch_r1 = r'(https?://)?([\da-z-]+\.)+([a-z]+)/?(\w+/)*([-\.\w]+)?(\?\w+=\w+(\&\w+=\w+)*)?'
for url in ['http://my.com?name=tt', 'http://student.shu.edu/tutor/cs/index.html',
'https://mail.shu.edu/index.html?name=tt&age=25']:
print(re.fullmatch(fullmatch_r1, url))
解析
- (https?://)? 表示可以接受的协议是http和https,不过也允许不带协议,圆括号中的内容就看成是一个小的pattern,需要括号中的元素同时出现。最外面的?表示表示有或者没有协议。
- ([\da-z-]+\.)+ 这是在解析url的非顶级域名部分,域名中允许出现数字,小写字母以及连字符,各级域名用.隔开。
- ([a-z]+) 解析url的顶级域名部分
- /? 斜杠可要可不要,因为不好断定接下来是否还有文件路径
- (\w+/)* 路径数量大于等于0,每一级用/分隔,这里我们只允许路径(目录)中出现数字和字母
- ([-\.\w]+)? 解析文件,可能会有文件
- (\?\w+=\w+(\&\w+=\w+)*)? 这是解析参数的部分。如果url带有参数那么,首先要以?打头。
判断一个字符串是否是合法数字
合法的要求如下:
- 正数前面可以不要+
- 小数点前后必须要有数字
- 科学计数法可用的符号是e和E,且前面要有数字,后面允许出现正负数
import re
#判断一个字符串是否是合法的计算机数字表示形式
# 正数前面可以有+,也可以没有。
# 小数点前后都得有数字
# 科学计数法e或者E前面得有数字,后面必须是[+-]?
num_pattern = r'^[+-]?\d+(\.\d+)?((e|E)[+-]?\d+)?$'
for num in ['112','-112','13.3', '12.3e12']:
print(re.match(num_pattern, num))
for num in ['1.', '12.3e', '3e-', '2.3e12.']:
print(re.match(num_pattern, num))
解析
- 模式串首尾的^和$分别表示匹配字符串的开头和结尾。
- ^[+-]?\d+ 表示合法数字可以以正负号或者数字开头,可以没有没有正负号,但必须要有数字
- (\.\d+)? 因为前面我们已经要求必须要有数字,所以这里可以只考虑小数点的后面。小数点必须要和其后的数字同时常出现才合法。小数点至多出现一次。
- (( |E)[+-]?\d+)? 同样地,e或E前面一定有数字,所以只需要要求e或E在出现时,其后跟着一个正数或负数。e或E也至多出现一次。