QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1957|回复: 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正则表达式(一看就懂)& Q; J: m( F' \9 q6 b7 s

      {: G+ V. [3 y) r7 S* @0 [2 w目录
    3 X" @* g$ Y; ?6 i( u0 t; H: V9 }5 O: s* J9 ~3 V7 I( e: g3 V/ `
    哈喽O(∩_∩)O😄
    ' [6 k, _1 c7 {; J% @2 P! c7 {* u* z+ o( {. M9 c
    什么是正则表达式(⊙_⊙)
    6 e* Y) F. {) x9 Z. p4 V
    ) o% a  {$ h. [简单说,正则表达式是…
    ' L; j. W2 Y$ Z8 Y! p9 c
    , G; t* u$ O) D  ?/ Q正则表达式怎么用❓
    8 a4 B* n( i# W! s1 K. e) i& b" U
    ' o7 p* Z. ]: p4 ^- V' Jsreach的用法🍊
    ! |2 \0 H3 `; `/ N8 V- ^# ^9 [" M, q( W6 k+ Y2 k/ H. R9 h
    匹配连续的多个数值🍉  ^( e: @5 n7 p# F
    % `2 k; `; n4 t6 n! O, y' |
    字符"+"重复前面一个匹配字符一次或者多次🍉
    # V# M. p/ g5 }5 N( h6 V3 U5 ^2 M; e2 b& L
    字符"*"重复前面一个匹配字符零次或者多次🍉0 Z3 J8 F, X4 x

    ; k! f: t. Q! m& i* Z( V* w; m  K字符"?"重复前面一个匹配字符零次或者一次🍉
    3 D! q; l* m0 ~; ^9 U8 h$ b8 ?/ Z1 n, O% A: f- w! F# n" t0 p
    特殊字符使用反斜杠"“引导,例如”\r"、"\n"、"\t"、"\"分别表示回车、换行、制表符号与反斜线自己本身6 t' c) Y% l$ I6 ?- h  y
    ' C4 Q) D2 q. E  F- c7 O

      l7 m: \  X' b8 _3 _' V! [" l# |/ g  h$ K& B( q: c
    完整表🔍1 q8 ^2 m/ a" y* E. p* C8 A9 ~- v

    " J6 g7 y. v6 }! k match用法🤔. J9 X1 G% P& P/ @3 {7 T4 a# f" `
    5 |' j" w' D/ e8 Q% _4 D
    match用法😃
    - s7 Z1 J3 E% i; n+ }) {
    1 P$ v# c2 M* x9 o3 t# @, I$ y match对象🍊
    5 F) l& ?" P: l6 l# G# \! K1 x9 p' L2 ~) s7 ^, v0 P( p2 f
    数量词🍊
    " n: w1 l: y) I. n& ~! |/ b+ n
      n  i! h* @1 n* [匹配开头、结尾🍊, [, M- }, i8 T" f0 t6 \+ p& y
    ! k* e8 Y" F# M/ A
    ! K7 x; i1 L/ O. w2 U* U

    + j- h: v, f" F5 R+ i! n3 A, K 匹配分组🔍! f, W9 a1 v! `+ S; T# K- a' ?* ~
      p# y# B4 ~8 S  K
    match总结😄" i/ o( T& G% }( ]/ U: J

    0 E$ g6 O3 h9 F0 ~% s) h实践出真知 凸(`0′)凸 ☀️
    8 J' b6 t( \* k% N4 F# a7 m/ ~2 Q' V6 a3 P: W* W! h+ F
    写在最后🧐4 s/ M2 {% d/ f; @4 p  d7 e

    + T7 W! k- }/ }+ L, T哈喽O(∩_∩)O😄
    0 a8 h) e( l. M7 i$ `* J0 G今天来发一下python正则表达式,其实这个也是比较简单的
    4 a* r8 T% r. K# r; C8 s3 M, F3 d+ _+ G
    肝了好几个小时才写出来呀4 Z( f4 ~; [- ^5 f

    & [% x9 G& z' h什么是正则表达式(⊙_⊙)
    ) ^4 F- z& o8 b2 m" a* W目前越来越多的网站、编辑器、编程语言都已支持一种叫“正则表达式”的字符串查找“公式”,有过编程经验的同学都应该了解正则表达式(Regular Expression 简写regex)是什么东西,它是一种字符串匹配的模式(pattern),更像是一种逻辑公式。
    3 o6 b$ p2 u. f. S% e
    & I/ ]3 Q; S5 A' I% w4 f简单说,正则表达式是…# o: N8 ?+ B4 Y
    python中必备的工具,主要是用来查找和匹配字符串的。
    ; j# @' E# M+ m8 O; l7 @9 h$ J/ X; f1 ~  S) w6 D
    正则表达式尤其在python爬虫上用的多。
    $ w. K' C8 e8 v% v0 k3 Z  s2 C9 K; {
    正则表达式怎么用❓
    * G  N2 w  G) [+ g5 ]& {: [首先,我们要导入头文件(写c++写习惯了)模块
    , F, r9 U3 m. B; ~5 J, r. n1 e+ B! R( e; m4 C9 D9 M( Y) S
    import re
    1 n2 h3 j: a5 u; m8 I8 U1 @因为re是内置模块,所以不需要额外安装,就很银杏) M7 n' s, l/ u
    " X, u1 ?/ ^! l  A3 E) o7 I
    sreach的用法🍊
    3 M' L# `. T1 w& K/ g8 D匹配连续的多个数值🍉
    3 B% Z/ [) {9 q, j7 g) P1 d
    + m1 C- e+ c' s  o3 B; H7 p  }  ?3 b, d
    import re
    ' _- T- \: c# L5 R; [7 {# `1 m& [: `! D2 n3 y  h$ F) F
    r=r"\d+"
    : p7 ^% \/ b8 i$ p  \4 z1 um=re.search(r,"YRYR567eruwgf")#目标是5673 g! H$ i7 x1 [- u
    print(m)
    * @; t* _; ]1 ?
    4 c5 D9 Q& Q: |. V; kre模块中,r“\d+”正则表达式表示匹配连续的多个数值,search是re中的函数,从"YRYR567eruwgf"字符串中搜索连续的数值,得到"567"  ^3 C  ]& z4 P2 y) L

    ) H( ^9 y% Y/ c( f( ?结果:
    ' D  r# x  J) y3 r/ s
    5 Y9 x6 M2 z; P# n8 l+ v% S; O& {8 n# V( q1 q
    9 S1 }# c' g0 R1 F
    可以看到,搜索到了连续值“567”( o/ q) Y/ M8 k. T) Y/ i

    ( Z5 H  [5 J0 F0 y4 c0 m 字符"+"重复前面一个匹配字符一次或者多次🍉7 V/ H; l1 D; @+ G: w7 l' h

    4 U# D1 U$ D: _/ n
    ; ~- N$ Y' R3 f; X" x& Oimport re
    % W! ~  p0 h: N$ ?; c+ ]0 f, A" D+ ?" Q4 A. K
    r=r"b\d+"" l: z: ]) y! e# U' d  K
    m=re.search(r,"a12b1233cd")
    + ^/ z" r; }; S6 V: n9 O/ B7 Y& uprint(m)& V- R( r) o4 Q/ \
    # a- h$ w5 q! S7 w; E
    这样,结果就是b后面的连续数字7 [% @. J7 `# i  T6 ^3 |

    % Z2 e6 M2 ?9 Y4 _' a结果:
    & R, r* y% O" z" a( W, V: i' x7 ^
    8 X0 k( j2 z7 [% V) S; I

    4 |6 c! R3 y, W字符"*"重复前面一个匹配字符零次或者多次🍉
      y( a/ K9 y. u1 a8 J8 l* l% e“*" 与 "+"类似,但有区别,列如:
    . f  g4 G7 W2 L( J* I9 C可见 r"ab+“匹配的是"ab”,但是r"ab “匹配的是"a”,因为表示"b"可以重复零次,但是”+“却要求"b"重复一次以上
    ( h$ D1 v+ K( I9 O! J- V) F* |$ r! V( s( w4 ~

    1 A+ n" @, A& q: S6 W% `" H5 j& y  c: b# t
    import re
    # D7 |: I& f$ ^! f6 ]* g5 U
    6 V) E, j7 A  \7 u: Vr=r"ab+"3 Y. D/ A* G5 ]
    m=re.search(r,"acabc")
    " R! a; C" V# I2 `8 i( N9 hprint(m)
    ! U$ u. W- V1 t* M$ J% a1 j. T* p3 `6 Y+ u, }  T
    r=r"ab*"( W" }! p5 x, a( i9 m8 ~2 E+ Q
    m=re.search(r,"acabc")$ e7 q& X- T3 z1 g( k
    print(m)
    0 X/ g$ Q' }6 u6 S7 {' g) S 结果:8 E3 f- G# ]1 k# h$ \9 m3 U

    ' }2 Y( |/ N5 [. M/ t* B' O2 }8 q# J0 f$ a( z0 z/ ^: @- J6 P
    ) C+ E1 q& m5 ]; I# g" v3 H
    字符"?"重复前面一个匹配字符零次或者一次🍉
    6 c1 r# E) a* E2 f3 D0 N匹配结果"ab”,重复b一次 4 u/ O; L5 y" m& M+ |  B

    2 I) N8 U9 d$ \$ x; f
    3 p, ]( y2 d$ U# f( c" w
    ! [6 S4 }5 I- W2 a! O/ ]import re. k; ~1 p0 F, u

    : g# g- o9 w* a2 A! F2 Z0 N* m/ Ar=r"ab?"
    ) B% n' }; s7 P2 J$ sm=re.search(r,"abbcabc")
    2 F$ K6 ]  U$ C! J, l2 Dprint(m)& k% S, E2 M: n; @; c
    结果:
    ; a5 C  B9 `5 k
    8 H5 E( b6 o' g' g5 k9 N5 R" ]" S4 Y1 |4 H

    1 e  b! W: X- o' r: ]特殊字符使用反斜杠"“引导,例如”\r"、"\n"、"\t"、"\"分别表示回车、换行、制表符号与反斜线自己本身6 P- u. R6 j! g( w
    7 W) u2 I7 G( j  t8 R7 R
    import re6 b0 l7 K- M, d4 ?0 Z1 o* J
    + V9 T3 M+ g' N- K
    r=r"a\nb", v7 D/ E: Y/ I2 |9 x+ c
    m=re.search(r,"ca\nbcaba")2 Q' O" t2 Q0 X5 b* z
    print(m)
    2 ]0 @6 I1 a3 S" y+ x7 \ 结果:
    4 @' k2 u& E, P) z2 _  v
    - N' S2 j( w* \5 \0 b6 y! G0 m- D8 D1 }1 d% g. A% L

    $ ]! {& J. e, `2 u, K* G 完整表🔍) y/ s0 i. A' t' \
    其实上面说这些都是比较基础,比较简单的,还有复杂一点的,都在这张表里' U8 ?; z' C& a+ s$ S7 g7 ?  {
    * e/ N- v8 q' w# _& c

    4 ?4 {  ]! a/ }. c: O- U5 u; f" `2 H0 C- V: \4 R
    match用法🤔' {5 t2 H, ~0 \- Z* l4 m  K
    match用法😃
    8 x) `6 o# y: z! z- g- H语法:re.match(pattern, string[, flags])  
    9 R8 f/ `: I6 `( u8 A1 z& a% D6 Z; i1 H( ?: E
    从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。. L8 q, M4 j: J; w/ o8 ?" e# J
    9 v4 Z' r& g7 {, v6 e4 c2 {
    #示例:$ ^" i3 Y# i. }- \  |
    name='张三'1 Y" z8 X/ V4 v6 X+ J
    if re.match('张\w+',name):
    & J- y. x1 E6 \' `# W    print('{},你好!'.format(name))3 |0 k9 K* n% S! Z9 S$ Y* w& U
        # 张三,你好!; |# L# }9 |) _. K- M
    输出结果:张三,你好
    3 a4 i; X. \- {! W1 J/ {8 _. L
    % P& N! A3 a/ A3 E$ t! q, ?
    4 J0 R* w; M! D2 e8 m8 T6 k# D6 x' R1 G# [( k' i
    张三:谁叫我?5 ?) Q. C  L  l# m, ?/ S9 S, ^

    / l0 |) I/ q6 @& `/ d6 k- z7 l不开玩笑了,继续% X+ H$ t3 E% q0 U% `
    9 v& }/ A8 u4 [; J
    总的来说,match就是% G7 R  G# e% P, _# Y

    5 o6 E5 L$ q& q) c返回匹配的match对象$ J5 \. \# w3 J/ O$ k
    默认从给定字符串的开头开始匹配、即使正则表达式没有用^声明匹配开头! y0 X' S4 {  `$ q! I: [: @
    match对象🍊4 k& x) {+ Z% l% s1 \8 G/ j$ H
    Match对象的几个属性:
    9 e/ ^! w) \0 }8 z. j" ~3 r+ V% ?8 c4 S  i
    注意,前面是有“.”的
    8 w9 T7 S7 z! j. M; l, S1..string 待匹配的文本+ u8 p% K6 d# M4 X, U
    2..re 匹配使用的pattern对象
    0 p$ `3 I/ p$ K5 Q9 q& g6 v6 T3..pos 正则表达式搜索文本的开始位置
    ( H, z% t7 ^6 t" x  X  I4..endpos 正则表达式搜索文本的结束位置
      Z2 ]! p6 l" l$ ZMatch对象的几个方法: * x4 O6 G8 w- P- E( e" M/ t- M- ^
    1.group(0) 返回匹配到的子串
    9 G3 ^& f: K$ s4 Y, d" _' \' i2.start() 返回匹配子串的开始位置
    / ~- g# D' `/ S& R3.end() 返回匹配子串的结束位置
    6 f) u9 T& r& z: c4.span() 返回start()、end()2 K4 q: G# g6 x/ W6 C

    1 L; o; J* h. s数量词🍊
    ; t) D7 v' T- H3 h% N
    % w: |6 e( t% V# {
    9 G3 Y/ x5 j, H# g" M) F( o匹配开头、结尾🍊
    * ?9 M: h6 X: o& R: ~9 h
      L; \( K% f6 j$ J' ^) i" g 匹配分组🔍
    1 c) b* c+ ]5 \5 y
    ( [0 g5 w4 j9 c3 e
    # K1 ?( u0 A! Y* k! w' k好了,看了上面几张表,其实我觉得最重要的在下面  9 F4 ^, b$ L9 T' }5 K

    1 `/ U* }$ {. k7 [7 X; E3 mmatch总结😄, K/ R3 v$ Q* Y* E2 D* Q2 M( m0 u% g
    其实没啥好总结的,但你要看懂这张图,这个很重要
    & N/ X9 e* r/ h& I0 R) v; N+ G; A. a/ V& m- R

    9 ?: h' a' _' [9 a
      c& d4 c, v/ b" B! d6 z 我框出来的是我自己感觉经常用的0 H1 q" O; l0 ~

    % u: h! S1 d6 l2 I7 e其实我自己刚学的时候也听不懂,现在觉得可简单了8 o5 u- c! N. S9 H9 Z" q3 U: V
    $ c' ~" X8 v: k/ h4 M6 O9 ]
    所以,你应该现在就觉得很简单吧?9 U* l, K  Q) A- m

    # e* W3 {" U) E; W& L( l7 }/ J但是,正则表达式的字符很多,容易记混,一不小心就好几十个报错,很让人崩溃
    5 B2 p# s6 p; p+ O# ^& o# t4 f- ]3 w
    & N/ l+ ]: c. [- m, S

    4 R: D9 H) `+ \$ E$ A实践出真知 凸(`0′)凸 ☀️! p2 y) c1 W' K0 _7 x8 M- T/ |
    学了这么多,是不是想撸个程序了?
    3 X( D% }/ ?1 B! d% X9 O9 Q/ c1 ~9 h+ O/ G0 h% k) V
    已经给你准备好了
    : f: c8 \' F+ E4 ]5 ]2 c% @4 q/ J
    程序效果:输入手机号,通过正则表达式判断手机号合不合法,
    + S9 y/ Z; N6 t/ {- d5 Y: G5 r0 Q4 s! r5 s4 w) u$ q( \" s+ s
    如果合法,就输出这个手机号的信息(所属地等)
    ) E6 v- k, ?' T& q0 ~- E0 t! R' T; G; V) X/ D
    如果不合法,就重新输入,简单吧?
    3 i- O) U6 x% I! A1 j3 Z8 K9 u. d5 q( P9 s+ @! j8 X" J0 C# p: Z- b
    这里我想重点说一下怎么获取手机号的信息; E2 K8 K5 N5 {3 f

    7 ~! j  B6 x4 a6 T5 j/ j我一开始打算上网上百度一波的,没想到直接复制过来23个报错、我也是醉了1 o9 A; X+ C$ m% S, d7 t- N9 x/ P' F

    / m9 R- L; D* q9 t* k' T8 i2 E9 L4 L
    ' D3 h- C) S! a2 ?, x9 {6 e
    哎呀,不能再发表情包了
    " a- Z. x7 C4 N. g% r# F* _6 O6 d3 V
    * s2 T* G, Z( W& J" k8 h$ _6 v5 o! \) K
    7 q" z2 {) g. q/ J) }
    ε=(′ο`*)))唉,还是自己写吧、、、: _( f1 Q0 L( j& p# ^8 x

    . J/ Y( p8 |6 d4 S/ w9 \( T我想起了有个模块叫phone,可以实现这个功能! |1 U' ^1 V/ D3 X

    ( ], h% o! N, ?4 G- ?但是你可能还没有安装这个模块,要按命令行模式下输入pip install phone  @$ L' M5 ~# t  s) b8 {2 A

    : D& w. N* q, {0 K等个六六四十九秒就下载下来了
    0 ^% Z& B  M6 @, s( b+ N
    : f% v' t- c. U" G+ {然后你就可以体验一下了
    & ~3 a4 J6 f9 T: @! X! L: j& I9 c2 r2 L
    代码(PyCharm运行通过)& ]( G% f+ S/ g% O- i3 k1 l

      A) V2 u- E& y' o$ E1 kimport phone8 h8 N, f' k/ A& c! k: ]  e
    from time import *
    + J% U; ]* J! Dimport re6 z' m1 Z9 A% g5 w' a
    % y  P$ n- O1 V1 }& @# s
    def begin():
    + [3 E- }$ h2 O# j# f: K    print("欢迎来到查询小程序")8 j/ _1 v/ H- U$ W
        print("1.查询")
    4 k, @/ t- @: N: H2 f    print("2.用户")- _% k0 w' u: {1 v. q3 C

    - `9 E# J  ?1 [9 M. Z/ B" ^* ~. P. v, k) {& i( T0 C. Z
    def p(n):
    % a  q" U& t9 c. W    if re.match(r'1[3,4,5,7,8]\d{9}', n):
    - ~- q5 u, C0 ~% J9 Q        if re.match(r'13[0,1,2]\d{8}', n) or \
    ( l& V$ V( _( X$ m& y! k                re.match(r"15[5,6]\d{8}", n) or \
    1 H/ m% C/ x5 x1 f& z. J. ]) e                re.match(r"18[5,6]", n) or \1 |* d' {5 M) D  L1 ?$ `7 }9 j
                    re.match(r"145\d{8}", n) or \$ F( ^  \& N2 \( p# g
                    re.match(r"176\d{8}", n):9 `' X& @; }9 S9 W
                return True) O% b4 a  e! L$ G
            elif re.match(r"13[4,5,6,7,8,9]\d{8}", n) or \! \/ T$ {( H, T1 B/ [
                    re.match(r"147\d{8}|178\d{8}", n) or \* d1 _3 c7 G4 c9 b  I
                    re.match(r"15[0,1,2,7,8,9]\d{8}", n) or \
    & t6 L0 I7 P, C, H5 p$ X                re.match(r"18[2,3,4,7,8]\d{8}", n):! v9 ~% B6 s1 O$ X8 \0 {7 ]& c
                return True
    3 j+ a; g2 Z& w' d# i5 Z        else:3 l5 I  U, n" z2 x
                return True
    3 X6 b2 ~1 }2 s  |- ~3 N    else:
    8 A' S" m, S+ ]0 i        return False9 g# w; B- ~+ m( U; d! H/ j

    : J% k# b3 g/ G7 X2 k, Tif __name__ == "__main__":
    1 v1 i7 G* @/ o7 m$ B    s=0
    1 [( {7 I& b) e    begin()
    ! H- f% n- c: C    while True:. d/ S0 e9 D6 M8 o
            op = int(input("请输入:"))
    6 \9 h' R" T- p3 U        if op==1:: Y6 I$ _' }' ]$ x9 I
                phoneNum = str(input("请输入你的电话号码"))
    8 z5 K4 Y: G( V- T4 d/ X# d# Q- s& |            if p(phoneNum)==False:
    ) |( f0 o) E5 m% ?                print("该手机号无效")9 O* V4 {8 o/ W
                    for i in range(100):
    0 ~- n+ Q+ I$ X) Y$ @: r                    print('\n')% M4 k; N- B  K+ u3 J( }# [/ p# _
                    begin()1 \) j5 X* G% H
                else:  [* X8 }, T! I- V* j
                    info = phone.Phone().find(phoneNum)
    3 A7 e9 Y9 m5 Y                print("手机号码:"+str(info["phone"]))# R5 {1 t% e, }$ _/ p, D: a8 c
                    print("手机所属地:"+str(info["province"])+"省"+str(info["city"])+"市")
    5 R* ?; J+ T1 }- X  B                print("邮政编号:"+str(info["zip_code"]))# f1 ]( I2 _& c# |9 Y3 w) Q$ f
                    print("区域号码:"+str(info["area_code"]))* I: D  w3 H9 ~. n5 v  d
                    print("手机类型:"+str(info["phone_type"]))+ a, Q7 m- {1 A! Z' v  d8 A
                    s+=1
    % [; W( W" p; `" ^; r$ ]                i = input("输入任意数退出...")# \6 Z+ [- T9 j/ _. Y
                    for i in range(100):
    2 t) m4 R* r8 r$ f$ U' ]: f2 b7 y' S                    print('\n')
    " [+ B7 ?- \  l6 m3 B                begin()8 c9 ]# ?7 ^# p% Y
            if op==2:! V) f- N  w* W3 \) i& B) G
                print("使用次数:"+str(s))
    # f6 r! x$ g( c7 @            i = input("输入任意数退出...")) r# Q9 n5 ^: T; |9 Z
                for i in range(100):3 X9 S! f. t. [$ G0 ?
                    print('\n')/ I9 u# V( h& S8 ~, a
                begin()! a2 p3 d4 Q0 L6 A+ R
    9 Q7 F$ C& h5 h0 B: N) E) E, ^
    写在最后🧐1 }% o1 ]( G( \* x
    ————————————————7 a3 E- D+ ^; r4 w0 m1 G
    版权声明:本文为CSDN博主「YR_T」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    . D. F2 \/ i( ]3 m. o2 u" y原文链接:https://blog.csdn.net/m0_64036070/article/details/123853489
      V1 Z$ P& C) C' E9 R/ p' N8 Q
    , U* n* v% R7 d! c9 y8 j
    8 _% `8 X3 v( O3 }" S) s4 }' ~" S
    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-7-29 22:44 , Processed in 0.262644 second(s), 51 queries .

    回顶部