有名分组,无名分组
有名分组和无名分组的区别,一个传递是位置参数,一个传递是关键字参数
无名分组
\d+ 匹配数字
\w+ 匹配字符
'无名分组'
import re
pattern = r"(\d+)-(\w+)"
text = "123-abc"
match = re.match(pattern, text)
print(match.group(0)) # 整个匹配结果 "123-abc"
print(match.group(1)) # 第一个分组 "123"
print(match.group(2)) # 第二个分组 "abc"
无名分组可以通过索引来引用,无名分组只关注匹配内容,没有特定的名称。
有名分组
import re
pattern = r"(?P<number>\d+)-(?P<word>\w+)"
text = "123-abc"
match = re.match(pattern, text)
print(match.group("number")) # 分组名称引用 "123"
print(match.group("word")) # 分组名称引用 "abc"
有名分组是通过 (?P<name>...) 的语法来定义的分组,其中 name 是分组的名称。有名分组除了可以像无名分组一样通过索引引用外,还可以通过名称引用,使得匹配结果更加可读和清晰。
无论是有名分组还是无名分组,都是在正则表达式中用括号括起来的子表达式,用于匹配和捕获特定的部分内容。使用分组可以在匹配时获取到特定的数据片段,便于后续的处理和操作。
有名分组无名分组,在django中,类似于是前端通过get请求向后端传递参数,从而后端返回不一样的数据,前端得到不同的内容。
无名分组
分组: 就是给某一段正则表达式用小括号扩起来。
# d+ 无限匹配数字
1 匹配单个
url(r'^test/(\d+)', views.test),
def test(request,xx):
print(xx)
return HttpResponse('test')
2 匹配多个
url(r'^test/(\d+)/(\d+)/', views.test), # 将括号内的参数传入视图函数
def test(request,*args):
print(args)
return HttpResponse('test')
'多个参数可以用,*args'接收
分组: 就是给某一段正则表达式用小括号扩起来。
有名分组
像是给正则表达式起了个别名
# 有名分组
url(r'^testadd/(?P<year>\d+)',views.testadd)
def testadd(request,year):
print('testadd')
print(year) # 这个参数,接收正则匹配到的内容
return HttpResponse('testadd')
# 有名分数就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
有名分组和无名分组可不可以同时使用?
1 有名分组和无名分组可不可以同时使用??
'不能'
2 但是 单个的分组可以使用多次
# 单个的分组多次使用(有名无名都可以)
# url(r'^index/(\d+)/(\d+)/(\d+)/(\d+)/', views.index),
# ·········································
url(r'^index/(?P<year>\d+)/(?P<moth>\d+)/(?P<day>\d+)/',views.index),
# 单个分组多次使用
def index(request, *args, **kwargs):
print('index')
print(args)
print(kwargs)
return HttpResponse('index')
# args 123 456 456
# keargs {'year': '123', 'moth': '456', 'day': '456'}
#···············································
"""
无名分组多次使用会将匹配到的内容当作位置参数返回
有名分组多次使用会将匹配到的内容当作关键字参数返回
"""
反向解析
通过一些方法得到一个结果,该结果可以直接访问对应的url,触发视图函数的运行
# 先给路由与视图函数起一个别名
url(r'^func/',views.func,name='ooo') # 起别名
# 反向解析
'后端反向解析'
from django.shortcuts import reverse
print(reverse('ooo')) # 在当前页面的视图函数中声明
'前端反向解析'
<a href="{% url 'ooo' %}">1111</a>
**前提是先给路由与视图函数起一个别名
无名分组反向解析
# 无名分组反向解析
url(r'^wuming/(\d+)/', views.wuming,name='xxx'),
'前端'
<a href="{% url 'xxx' 123%}"></a>
'后端'
reverse('xxx',args=(1,)) # 会运行这个路由url
# 这个数字写代码的时候,一般放数据的主键值,
数据的编辑和删除
url(r'^edit/(\d+)',views.edit,name='xxx')
def edit(request,edit_id):
reverse('xxx',args=('edit_id',))
{%for user_obj in user_queryset %}
<a href='{% url 'xxx' user_obj.id %}'>编辑</a>
{% endfor%}
# 一般可以用在网页跳转使用,
有名分组反向解析
# 有名分组反向解析
url(r'^func/(?P<year>\d+)/',views.func1,name='ooo')
# 前端
<a href="{% url 'ooo' year=123 %}">111</a> 了解即可
<a href="{% url 'ooo' 123 %}">222</a> 记忆(不用写关键字参数的名字,直接写数据,多个数据空格隔开)
# 后端
'写法1'了解
print(reverse('ooo',kwargs={'year':123}))
'写法2' 简便写法
print(reverse('ooo',args=(111,)))
路由分发
django的每一个应用都有自己的templates文件夹,urls.py static文件夹, 基于上述特点,django 能够很好的做到分组开发(每个人只写自己的app)
最后只需要将所有的app拷贝到一个文件夹中即可,
每一个应用都可以有自己的路由和视图文件,urls.py views.py 如果没有 ,就手动创建一个。
匹配的时候先匹配总路由文件,然后由总路由分发给每个子路由,总路由不再执行具体的视图函数,而是交给子路由
# 总路由
from diango.conf.urls import url,include
# from app01 import urls as app01_urls
urlpatterns=[
'第一种写法'
# url('^app01/', include(app01_urls)),
'第二种写法'推荐
url('^app01/', include(app01.urls)),
url('^app02/', include(app02.urls)),
]
# 前缀是哪个app,就交给哪个app处理
# 子路由
# app01 urls.py
from django.conf.urls improt url
from app01 import views
urlpatterns = [
url(r'^reg/',views.reg)
]
django2中的path函数支持的5种转换器
path('test/', admin.site.urls)
Django默认支持以下5个转化器:
● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
● int,匹配正整数,包含0。
● slug,匹配字母、数字以及横杠、下划线组成的字符串。
● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug>/', views.article_detail),
# path才支持,re_path不支持
path('order/<int:year>',views.order),
]
re_path正则表达式匹配
在Django2.x以上 , 需要用到有名分组和无名分组时,用re_path . 用不到的时候,用path就行了,和url的用法差不多其实
from django.urls import path, re_path #导入re_path
from . import views
urlpatterns = [
re_path('test/(?P<year>[0-9]{4})/', views.year_test),
re_path('test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.month_test),
re_path('test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[^/]+)/', views.article_test),
Django 2.0 和之前相比多了变量类型转化这一步骤。目前路由(url)到视图(View)的流程可以大致分为四个步骤:
- url 匹配
- 正则表达式捕获
- 变量类型转化
- 视图函数调用
新增的 path 方法可以帮助我们解决以下几个问题:
- 类型自动转化问题,可以使用类型转换器完成;
- 公用正则表达式,牵一发而动全身,使用类型转换器也可以规避这个问题。