QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1939|回复: 0
打印 上一主题 下一主题

Python正则表达式(一看就懂)

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-7 15:37 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    Python正则表达式(一看就懂)
    + P/ ^0 O! ~9 B  O! D/ w* t+ f" X& ~6 u, n
    目录! b, z$ g/ V( w1 a
    # _7 B8 l9 f/ n! v& F; _6 }
    哈喽O(∩_∩)O😄! |3 w3 c4 l& d0 F, K1 G$ ^* W' Z
    + n0 h" D- K5 l' a2 Y* ]7 O+ K; @
    什么是正则表达式(⊙_⊙)' v/ W( E5 H) S! ?
    6 m5 G1 m5 C. G: t
    简单说,正则表达式是…/ q) ?( O. }5 n) M6 R" v

    0 D* I( w8 g7 i! z! q; A正则表达式怎么用❓
    8 {) Q5 v2 C, b5 Q1 q5 N1 L$ H: \* z: p
    sreach的用法🍊7 d9 s1 O, G4 _3 L3 d8 c; s
    . y6 g" d9 R/ R8 O- k- I% m) m! t# A3 O
    匹配连续的多个数值🍉
    / Y) z2 c' y5 T" b! ^: H8 j# D" R# G" H8 n& P/ a0 K' m2 |2 P8 ?* i
    字符"+"重复前面一个匹配字符一次或者多次🍉  ]) f$ K2 x8 N# ^: j9 ~

    ' I# }& R, A6 t字符"*"重复前面一个匹配字符零次或者多次🍉
    " K: Z+ h" j6 \/ ?1 w" ]3 _* v+ Y! p# |0 x/ m, u2 K
    字符"?"重复前面一个匹配字符零次或者一次🍉
    : P% {: q, v! u
    : x5 U4 \' Q  I" X. N4 ?$ ]+ [4 `特殊字符使用反斜杠"“引导,例如”\r"、"\n"、"\t"、"\"分别表示回车、换行、制表符号与反斜线自己本身
    # p+ \" d8 f% z& ]7 X: V# @: e5 \) c; p/ w

    8 W2 A- l% g3 Q7 n: Z& y/ H
    3 B" J# c0 q* F% ~9 N  T 完整表🔍8 I3 x2 ?4 X6 s
    6 V+ M5 z! _" M- A  O
    match用法🤔2 E4 W! E) @, s0 O

      j9 I$ g, @: u9 X- g& Bmatch用法😃7 _; g6 s* ^/ d4 t2 ^7 G7 ~! M

    : E% x5 X( t  N2 y( s8 F! ` match对象🍊
    ) E6 ^  ?$ S' v& ]' N, M
    2 T  i9 E1 {) D. h) L数量词🍊8 ^( B% a* s) S

    ( [* ^4 v8 l5 X: c6 ~匹配开头、结尾🍊
    0 I0 i/ F" i9 ?5 ]$ d/ C/ D5 Q: P% c/ g
    % e4 Q9 N' {+ ?8 R7 J+ i- T
    . ?* ~6 P. s- U0 z
    匹配分组🔍$ h$ s$ Z3 v% N3 s# Y, `8 b

    0 Q& f* H# i6 M$ lmatch总结😄
    * C$ s4 R$ r  j! M
    1 ]1 c4 N; ^% t) _# Y实践出真知 凸(`0′)凸 ☀️
    4 x; y+ c5 q% h7 L0 d  `( ?$ y0 z( a5 a" \9 I7 w4 M
    写在最后🧐
    / ]5 Q% P  F, F! }1 G* ^$ ^/ X
    % w3 {: S% u/ |哈喽O(∩_∩)O😄
    1 g5 H- ?) I( Z5 I/ }今天来发一下python正则表达式,其实这个也是比较简单的1 S) ^$ b4 k( R1 o# o; R
      `& h7 s: y" m" }/ v; k1 s" {, G
    肝了好几个小时才写出来呀3 r4 S1 t' C% X  }& v3 x

    : S5 a7 b+ _' ]+ y6 [. r. w什么是正则表达式(⊙_⊙)) m  f( ^9 J: D# S8 k) S( M3 e3 ^* K
    目前越来越多的网站、编辑器、编程语言都已支持一种叫“正则表达式”的字符串查找“公式”,有过编程经验的同学都应该了解正则表达式(Regular Expression 简写regex)是什么东西,它是一种字符串匹配的模式(pattern),更像是一种逻辑公式。
    3 ^9 R0 {& e4 d8 H, d1 j' L; @" L6 F1 e# I! v
    简单说,正则表达式是…# Q# a( i7 v/ A& ^' J$ [
    python中必备的工具,主要是用来查找和匹配字符串的。
    % G% S) R/ i) D6 c( q# Z. K
    % B. I8 B$ A( S3 l" f1 J! j% F正则表达式尤其在python爬虫上用的多。
    - T0 G. I* e/ W% \/ M. Q" k, _
    * p- s* Q  Z( n1 E正则表达式怎么用❓
    - K2 c7 M3 s0 b1 t% {$ r% @首先,我们要导入头文件(写c++写习惯了)模块) N2 l  T# ?) t. T9 {; ^$ w
    ! {+ [( l! B6 A2 ~" n- h
    import re, P5 `; C, ]% K4 |! F$ o0 ~
    因为re是内置模块,所以不需要额外安装,就很银杏8 q: V# F: e. w. d2 N

    ! D- H9 _! v( ~! Q. zsreach的用法🍊# R* j' d1 [. g+ K0 b4 Y3 V
    匹配连续的多个数值🍉
    2 l5 I8 I' E' `/ O
    , b8 I; H0 U: k' V" \+ a" B
    , q# H6 Z- k' o% g' rimport re2 W. U- L: N2 C+ q, X8 {% G
    0 `1 A8 Y0 B1 K6 {; R) ], P
    r=r"\d+"! d# z& U9 `) Z7 a, g: Q
    m=re.search(r,"YRYR567eruwgf")#目标是567/ t& F: [$ h5 M% U' K
    print(m)
    ) e8 @$ a, C( M2 f' }8 u5 _3 a( }  Y
    re模块中,r“\d+”正则表达式表示匹配连续的多个数值,search是re中的函数,从"YRYR567eruwgf"字符串中搜索连续的数值,得到"567"
    0 s! a, N9 g/ A' _. a4 H( x0 b4 f; v' A2 d; a% {
    结果:
    2 [# |% b9 P/ ~, |, S
    , y3 }1 U4 q2 J6 y
    , {' z$ K# E0 o5 ~& t# a/ H  f3 P! E7 ?! I9 |  a
    可以看到,搜索到了连续值“567”
    3 g$ m: H# M4 b4 f- G& r  T9 q5 D' J' d. I. q
    字符"+"重复前面一个匹配字符一次或者多次🍉/ s* G! q9 Q1 X: U2 {0 j. W. }
    , o) q5 t6 ~+ Z% `" T$ `
    : T5 O* X( h. a6 x2 K
    import re
    - }# l" a+ P3 Y' Q7 j+ C3 h% L! k; P* @4 z  B" K
    r=r"b\d+"/ S+ J0 J; U5 Y) ?+ q8 e9 ?
    m=re.search(r,"a12b1233cd")' [% `/ H( g& i. e
    print(m)
    & t+ J3 j+ `% ]1 e& W- r
    - e" }5 q3 |9 G4 y8 |1 ? 这样,结果就是b后面的连续数字
    % A* j! v3 o) H" _1 p$ {
    + u5 i& e  c$ L$ r4 t9 g结果:
      J3 a9 [, c, _  Z8 C: |0 N% T
    & Y9 _+ S, l" p$ t5 G! G$ R% C; W% _+ [2 H. H/ o

    " u9 P! W& D0 [字符"*"重复前面一个匹配字符零次或者多次🍉8 f; x1 V- k5 `
    “*" 与 "+"类似,但有区别,列如:" |* T- ]9 X  z2 `0 h' X4 M/ o
    可见 r"ab+“匹配的是"ab”,但是r"ab “匹配的是"a”,因为表示"b"可以重复零次,但是”+“却要求"b"重复一次以上
    9 x$ W9 {) o& u& G) x" c( X9 `; i' h* y, Y7 G

    1 Y  d+ n7 j  ?/ F% M) S& e2 e/ l3 a: }
    import re6 F; }6 o) Y( t9 `0 K2 }- t5 H

    ) Z% m9 r0 U* M" g0 b2 p/ Qr=r"ab+": T% G  p+ m; D6 C4 q' l* s
    m=re.search(r,"acabc")
    " K: @6 H# _& g& I- B/ `# i! t( gprint(m)! g. k+ r' V, `& U

    * q7 H+ u- {) lr=r"ab*"
    ) X# X% \6 L( S1 K# zm=re.search(r,"acabc")4 A$ X2 p- T. y
    print(m); M( _0 [/ l2 |) q) R  D; O) b
    结果:, ?8 N; ~$ z4 G1 H
    7 |/ I  e6 ?9 t

    * I/ o6 ]% M: E* ~) C' V
    9 w& _8 R6 V0 H/ {字符"?"重复前面一个匹配字符零次或者一次🍉
    1 {0 z0 h/ N! \; Q8 z9 Q- F0 k匹配结果"ab”,重复b一次
    3 ?0 D- A3 l  E& L% E, @6 t3 L, i5 U! l4 \. |. L2 h' U, ]
    * [0 k& o1 E, ~
    ; ^. f( G" E: J+ a9 w" [
    import re/ |0 w$ K# L. x. v- U+ c( O
    - A' y8 a7 K3 m% _
    r=r"ab?"
    0 q4 |( ~! G3 L( i8 J6 T5 Pm=re.search(r,"abbcabc")
    1 I9 Z) n+ x9 N* }' xprint(m)
    . Y+ n2 p; q: I  L 结果:8 R6 _. Q3 v6 l/ e
    , G- d5 l& S; e3 f
    8 X9 h; D" X1 _
    ) J1 @/ d5 T& E
    特殊字符使用反斜杠"“引导,例如”\r"、"\n"、"\t"、"\"分别表示回车、换行、制表符号与反斜线自己本身
    6 ]) d* M6 G' B) Z' X% @0 E
    $ H, f7 Z% x# c* |import re* m+ _' Q& G. v. {1 ]3 W
    * H% Y0 q9 \; Z! b$ U. C
    r=r"a\nb"
    ' r- _+ n6 ^: ~7 |( I, {m=re.search(r,"ca\nbcaba")
    9 e6 N7 v: t% v9 j; S( ^print(m)
    : W% c" r) F) r( g% _# H 结果:
    6 a# A: I! ~" z/ Y1 p* p3 y2 ^
    # a8 O4 c$ z" h0 J, ?8 l' `; A8 X' l* T% A/ k% Q; j& K

    9 v0 T$ k4 U; [( b: O3 T 完整表🔍
    * Z% j" b! P. A3 P9 C5 I" }' J其实上面说这些都是比较基础,比较简单的,还有复杂一点的,都在这张表里
    . N6 c* a" ^! m! S/ \: x
    - K9 E9 v6 W1 ^. p
    ; o) `4 R+ S+ L1 f( `9 \9 \' m' ^+ {) V0 k4 g+ V7 l
    match用法🤔  B% m0 T' {/ n% [& {* H& W
    match用法😃
    9 e  n# W3 d2 q6 b5 l9 Z" |语法:re.match(pattern, string[, flags])  
    ' O# Y  [0 w9 j5 Y4 O% i/ Z
    ! w( @6 i: d. o( T, u! N. D; Z从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。
    6 y; U' f# b0 N% s9 o
    # i. K9 k2 @) v$ u" T#示例:
    - o1 F- d! o/ Tname='张三'. Q- G; i7 M" H# q
    if re.match('张\w+',name):4 r# n/ v  W$ L+ w, z
        print('{},你好!'.format(name))
    ) l1 O8 Z+ B5 T1 y% h/ ^    # 张三,你好!# }' v! ?6 n: d9 r! C
    输出结果:张三,你好1 v/ u9 ?- p- P8 ^. v" \+ P
    $ T/ K( P3 o: J- w3 ?( l$ _, @
    , T, F3 C1 n; j2 Q6 V5 {4 H
    ! U$ A9 p2 v9 x4 o: u$ E, r
    张三:谁叫我?
    ( i, N& D7 ~9 Q" T2 D( K- }5 s
      J+ }* w$ P  A2 {+ j) O不开玩笑了,继续
    5 b+ @* y4 m# q- m  ^8 O9 H) p+ _3 \7 k# A7 i
    总的来说,match就是
    / ~1 ?/ I$ N' ^* S6 Y- H) |8 L: R9 O$ d0 r' `
    返回匹配的match对象3 b! q% Y. T3 d( F0 ^) O; D6 Y
    默认从给定字符串的开头开始匹配、即使正则表达式没有用^声明匹配开头; u5 f$ E6 u( i0 k. V
    match对象🍊
    6 }" u9 s' R% j9 E* MMatch对象的几个属性: ; ~, X, W7 W. X6 N2 @

    7 x2 E% S  h  ]" f' x注意,前面是有“.”的
    2 w2 V4 `* X* p2 ~) [1..string 待匹配的文本
    4 y6 g" K  \" V+ N' W9 l  d5 w6 n5 @2..re 匹配使用的pattern对象# ]- o) U, ?& S% Q( }$ U/ C
    3..pos 正则表达式搜索文本的开始位置( E0 n- j3 n/ k1 C4 H
    4..endpos 正则表达式搜索文本的结束位置7 k1 X- L/ I$ b1 ]4 r2 |; a
    Match对象的几个方法: 7 @& m; _; b$ \  r& z# J: j
    1.group(0) 返回匹配到的子串' {! N0 p1 V& c& m4 b1 q4 N# B6 H
    2.start() 返回匹配子串的开始位置. j: A/ U$ d1 a
    3.end() 返回匹配子串的结束位置
    ; P( a* ^3 [0 x3 k0 X4.span() 返回start()、end()/ K$ D) K' ^/ Q' m/ p* ?

    4 l% x2 k* z* Q, ^3 \数量词🍊
      X0 J3 Y; d. m! H' d2 _
      @1 E* c0 d" t' o. H$ }1 g6 M3 ~; x
    $ @3 L% K% h' o% u# o" z5 ^匹配开头、结尾🍊9 X* X( J/ i( c
    5 F4 D- V/ ~9 a6 E
    匹配分组🔍! Z# F0 V0 y. N5 y
    # H  {; @8 _0 E3 u- z+ t
    # w8 \4 r3 }$ `$ S
    好了,看了上面几张表,其实我觉得最重要的在下面  % [& D3 }+ v8 Y9 |2 P/ Z5 O/ x
    9 w, i! i/ g$ ^, O9 |! I5 B. H
    match总结😄  v7 U3 W7 k+ y# @2 W( N
    其实没啥好总结的,但你要看懂这张图,这个很重要0 i' ~# A  t! G% {6 G

    % \4 b3 J1 `9 }/ Y1 q4 h1 S& M7 L& C! ?+ k# r

    6 G9 U# x# n/ ~ 我框出来的是我自己感觉经常用的: |* q: A, n; }* f7 ]0 L. P
    - m, o. s# J# Y$ p, ?" \+ Q
    其实我自己刚学的时候也听不懂,现在觉得可简单了
    / h0 s. Y! e  D+ G  \* S: F% V# R" q7 S
    所以,你应该现在就觉得很简单吧?
    0 R2 S8 r4 g+ r! o3 o" T+ i8 N7 F- S: g! [
    但是,正则表达式的字符很多,容易记混,一不小心就好几十个报错,很让人崩溃9 v' W. a5 L& M. Q
    7 e5 a& v/ a: t0 @# z: i# l

    9 S, `4 A3 B6 F+ v: \8 f+ ]* N4 v( E' q
    实践出真知 凸(`0′)凸 ☀️9 ~: e: F. @6 P$ C8 h" ~
    学了这么多,是不是想撸个程序了?0 X1 Y+ n& a/ W* Y' j# v& i) c

    ' E' a: o% h$ g( J( z3 q已经给你准备好了
    . a9 x6 I8 i, R1 n% n/ v# I
    : Z6 b7 P9 p. m! r) Z% b. K程序效果:输入手机号,通过正则表达式判断手机号合不合法,
    7 g  ]: Q7 `; f/ R# j
    8 d1 q; S) Y; K  }6 d  p如果合法,就输出这个手机号的信息(所属地等)
      t: m5 f/ Y% ?; v2 W8 O) u9 v1 G6 N* W' W
    如果不合法,就重新输入,简单吧?
    : J: [% P2 R- A7 J* E8 o6 k) S% W; M2 K5 C
    这里我想重点说一下怎么获取手机号的信息7 o" g, g( R2 s0 Y. m+ m

      g9 V% o$ ^6 X. G我一开始打算上网上百度一波的,没想到直接复制过来23个报错、我也是醉了8 `: ^7 r! P" g- ~. B/ T: k

    ; ^( F, V3 F5 B
    ' w( Z) K* g" H& x$ X3 d
    + p, V  ~3 B$ _  D: g. E哎呀,不能再发表情包了
    0 u! t, z9 _0 K' B+ W
    * ~7 A) S. {5 x2 @/ ~9 a. ]
    / e% I& t! d5 |' j( W7 k
    " t* ?2 h8 \7 }- Zε=(′ο`*)))唉,还是自己写吧、、、4 O! v6 z( z# U3 o. M. c
    , T* a; q% G* H5 F; P
    我想起了有个模块叫phone,可以实现这个功能
    7 n, u3 `2 {. n4 h/ Q' B
    * N) h7 o; E. _! g  R3 P! L; d9 N0 H$ c但是你可能还没有安装这个模块,要按命令行模式下输入pip install phone
    8 ?# b/ k$ w% ^, \' f( r7 d- ~% r/ w* Q( J) m, o6 ]+ ^; E
    等个六六四十九秒就下载下来了
    3 B# O+ W$ O; ~+ {( i
    5 i# \) [$ r% z+ M" T1 J然后你就可以体验一下了2 H$ O, v6 B4 N4 e! D

    : ?7 Z0 m7 h/ K$ z4 T, {代码(PyCharm运行通过)
    3 y/ U5 p& `+ F5 `3 s% s$ z+ ]
    $ o. {; b( e1 b- k, limport phone) O( R' Z( O; c, d
    from time import *
    2 l1 T# _! h( L9 \# r7 Y5 {import re
    7 j. `; y; D- L- e3 s( [& ~$ n  H8 s& J3 ?, h6 f. a, ]
    def begin():
    , [5 x( y! B1 e3 `: ?: `& n+ c    print("欢迎来到查询小程序")
    % C2 S  [. f" x- |0 y    print("1.查询")
    & d8 N/ ~6 Z, _/ s" M    print("2.用户")
    3 }. a& A7 {0 ?  s( I4 A- s( S: L6 a+ a/ ?

    3 G$ Z" f8 I3 T# ?def p(n):
    3 f) r! H/ u3 I    if re.match(r'1[3,4,5,7,8]\d{9}', n):% A! t. j# @0 i- m
            if re.match(r'13[0,1,2]\d{8}', n) or \
    ' @. G" |9 S6 B# U5 C                re.match(r"15[5,6]\d{8}", n) or \
    * E+ Z8 V& g2 P; }                re.match(r"18[5,6]", n) or \
    4 i9 t7 F' I; |7 {2 v# {( q                re.match(r"145\d{8}", n) or \
    8 j6 }4 I" j4 F9 l4 q  U8 a                re.match(r"176\d{8}", n):( R' ]4 |. Y( t) j3 O& p" k. Q
                return True5 u0 f$ k' K0 v% T  N  g" e4 v
            elif re.match(r"13[4,5,6,7,8,9]\d{8}", n) or \
    $ X6 H# W" x0 h# I4 j                re.match(r"147\d{8}|178\d{8}", n) or \
    $ V( @/ ~. T. b% j0 N8 W                re.match(r"15[0,1,2,7,8,9]\d{8}", n) or \
    ( C4 e( H8 z8 R4 e. ^$ K                re.match(r"18[2,3,4,7,8]\d{8}", n):+ x! t; H3 L8 c& ?
                return True2 W" L) W  j) d% C; b2 q
            else:/ z  W& _+ r# j3 B/ m" A3 u
                return True9 U3 l; |0 g3 e- q$ a$ [& |# ~
        else:
    8 B  h9 L( P1 k& I1 k        return False
    : X, B* _* C6 R+ J- N8 E: C3 [% K/ C/ D) C. ~
    if __name__ == "__main__":0 K7 w4 T& S" X- Y$ I
        s=0: V' o1 [1 X9 |+ F4 S& _& H
        begin()& p' K# [9 K# I0 Q
        while True:# i# R) s; U5 C$ W9 _" k1 d  ~
            op = int(input("请输入:"))
    ! R. Z; \6 R" x% u8 j3 G        if op==1:
    1 _' e/ j, x0 ~" O3 a1 @            phoneNum = str(input("请输入你的电话号码"))
    : ?; J+ [7 v6 n# X- K            if p(phoneNum)==False:! g$ L; R5 f2 h: ^& f
                    print("该手机号无效")* p2 W& w3 k" r# G% o
                    for i in range(100):
    " D9 o  f( _' M7 ^* w! }6 c                    print('\n')
    7 G7 u( s, N! K/ i                begin()2 I2 z0 q( \! A9 M
                else:, r- s& p; t. z2 f; z
                    info = phone.Phone().find(phoneNum)
    , b0 c* Z) @% Q8 _& C                print("手机号码:"+str(info["phone"]))/ S8 Q# G( @/ J0 C2 Y4 m
                    print("手机所属地:"+str(info["province"])+"省"+str(info["city"])+"市")' E  ?* s& A2 Y% x8 l
                    print("邮政编号:"+str(info["zip_code"]))
    % Z6 l) E( U4 h: Z                print("区域号码:"+str(info["area_code"]))  w# j8 b+ s6 v% [" O
                    print("手机类型:"+str(info["phone_type"]))
    5 ^5 m) p9 q" K! Q; {" @                s+=1
    / U2 M" F- W# _. {% m                i = input("输入任意数退出...")
    4 m1 X1 q: N8 s, f                for i in range(100):2 l0 h3 z2 a$ k( q$ a
                        print('\n')
    ; v0 P. E; O, c* c                begin()1 k" ]7 z" Z9 ?8 W$ x+ X
            if op==2:
    ' z6 M9 E& w4 D; q' k            print("使用次数:"+str(s))$ q3 X1 Z4 U  s; H
                i = input("输入任意数退出...")
    5 j0 U3 v1 J" g! a! [; c            for i in range(100):
    3 e- y; A" U8 N- l                print('\n')
    0 _' Z. A+ I3 p0 s            begin()) ?0 s9 l3 o; e/ R0 M: r

    2 V1 Q0 p5 `4 U9 A6 n5 @写在最后🧐2 f1 t5 {% c0 M, |
    ————————————————
    0 F5 ^# A0 l0 P8 T) }7 f) R版权声明:本文为CSDN博主「YR_T」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    3 E3 H, l% {. r5 _( _, a原文链接:https://blog.csdn.net/m0_64036070/article/details/123853489
    / f5 P' d. H8 w, Z
    0 k) V; f7 `$ s, m# v8 o7 @9 g- l8 p
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-5-26 06:32 , Processed in 0.368362 second(s), 50 queries .

    回顶部