最近看到一个re.sub的使用,其代码是这样子的:
def build_route_pattern(route):
route_regex = re.sub(r'(<\w+>)', r'(?P\1.+)', route)
return re.compile('^{}$'.format(route_regex))
文章是讲述Flask中的app.route
是怎么实现相关匹配,其中讲到app.route('/user/<username>')
中替换需要使用的正则表达式时使用到了这个函数。
当参数route='/user/<username>'
传入后,得到的route_regex
的内容为/user/(?P<username>.+)
。
使用了几次后,感觉就是在r'<\w+>'
匹配到route
中的内容后,在匹配内容加入r'(?P\1.+)'
中除了\1
以外的部分,而\1
的位置就是匹配内容扩充所在的位置。
test_str = '/user/(hello)'
new_str = re.sub(r'(\(\w+\))', r'aa\1bb', test_str)
print(new_str) # /user/aa(hello)bb
!
具体应该是,首先第一参数(正则表达式)pattern=r'(<\w+>)'
对第三参数(目标字符串)进行匹配,匹配到的内容是<username>
,此时的表达式中加入了括号,也就是进行了分组,然后在第二参数(替换字符串)relp=r'(?P\1.+)'
对匹配到的内容进行替换时,替换字符串中引用了之前的分组,也就是\1
,所以此时替换字符串实际为relp=r'(?P<username>.+)'
,所以替换结果看起来就像是匹配内容外部加入了新的内容。
个人小笔记,加油。