QQ登录

只需要一步,快速开始

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

Python爬虫 正则表达式应用详解

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

5273

主题

82

听众

17万

积分

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

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

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

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-3-30 11:00 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    5 s# l. n' w3 l+ [! V* U
    Python爬虫 正则表达式应用详解
    ! ~4 @0 L) K% L. a+ }5 @$ [% T3 g9 X1 h' a* H* Q: ~7 k
    学习Python爬虫过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。) b0 Q5 L9 C5 a# f' S6 O
    " e8 R+ m; U. Y0 G
    —— 正则表达式应用详解 ——
    5 K# _* a/ z) g* g8 y6 K& l* I$ {
    文章目录' p3 A8 s% E5 B* G" q  q3 i

    ; n5 n1 W& q" i1 H7 T% iPython爬虫(二十一)
    ( a% [/ H6 a2 P9 G* G4 I3 O+ A—— 正则表达式应用详解 ——4 F$ S1 C& y$ Z! N1 K: f
    1. 简介
    , ?: |# r& w) Y4 V7 g- ^2. 语法5 \# l  D) n2 n# h- \& U' g/ Z6 Z' u
    3. 部分元字符应用详解2 C2 ]1 o. K" n5 G) E/ O
    ^8 ~$ l; G4 q! S" y
    $, O/ `- d: F) W+ y- w, o; n
    \A2 C3 h/ `( i0 o% c4 x0 Z: E. D% p
    \b- j3 x6 F: ?) N4 |) c
    \B
    & }" h# X+ J2 B0 w8 ~3 M; Q3. 正则表达式实例. X0 A$ W" w6 h; \. }
    相关文章:! z* S$ a" D0 p: I6 X* x
    1.Python的Re库应用详解(正则表达式的库)) e, o; A* ]5 c4 }
    2.Python的Re库与正则表达式的细节解析(正则表达式的库)
    , [4 j/ Z% T' X3 M  c; K2 q6 n" V! T9 `3 A- e& M1 c
    1. 简介
    2 ^8 I8 p" s! D) x* p! c
    4 J4 c  p/ ?. ]正则表达式:regular expression,也称regex,简称 RE6 [% ~; M0 l# L: o' K

    ; k) _8 y5 G7 Y' L) H. e# d正则表达式模式被编译成一系列的字节码,然后由一个 C 语言写的匹配引擎所执行。
      b% b/ v  o4 s. B- f8 i8 d% z3 \1 Y( S! T% G  Q$ P
    正则表达式是用来简洁表达一组字符串的表达式2 a+ y% b# X  u: t- G! N9 \: v
    $ g& \+ r% n) ]' k' m
    通用的字符串表达框架9 e; n- y# n6 B
    ( O: `7 U1 U4 r, M* q
    简洁表达一组字符串的表达式0 @' k+ b, \: h4 B9 H

    2 x  C0 o% `+ z6 J针对字符串表达“简洁”和“特征”思想的工具
    ! }( v# j8 T& I3 M0 f, i% w9 z2 |" ^, d- s0 G
    判断某字符串的特征归属2 E2 g. j/ i. U4 V
    " B9 M4 _, t; n7 e
    正则表达式在文本处理中十分常用6 r& x, ~; c- v6 R# `: `
    ' f/ Z  U5 s) e$ H
    表达文本类型的特征(病毒、入侵等)" D2 n2 ]" B% ]- e$ @7 {( v

    ! S( r0 i5 \& \4 S% m+ B* |同时查找或替换一组字符串6 U5 X6 ~4 `5 T4 L" q
    6 J# A& X, E9 h$ n
    匹配字符串的全部或部分: u& g* G( c5 ~# Z# k
    1 h1 c! ~5 C4 {# U# k6 n% r
    正则表达式的使用9 y5 G! o6 w3 m8 S

    - i$ ~5 y- X# k) N" z: S1 O9 |编译:将符合正则表达式语法的字符串转换成正则式表达特征
    % R" B4 L6 k' V  ^' `2 |; J) x* q! S! Q0 L6 Q6 n
    & r$ E( ]3 J( y* H( ?. K
    2. 语法% H  [. e$ {. `2 V5 ~* D
    : ?& \' z0 o. q5 k, l. V
    正则表达式语法由字符和操作符构成8 f, [0 s0 ^- v
    + m1 ]. H: M' m& ^6 Y; f
    有一些符号不能匹配自身,它们定义了字符类、子组匹配和模式重复次数等功能,被称为元字符 (metacharacter)。6 V, N" a" j: M  M0 K
    元字符包括:. ^ $ * + ? { } [ ] \ | ( )
    " T. s5 Z6 t! @& P" O正则表达式的常用操作符
    " Y, L7 ?: h6 T0 p在反斜杠后边紧跟着一个元字符,那么元字符的“特殊功能”也不会被触发
    1 ~; c5 m' q9 V操作符        说明        实例( @, `  g$ M9 t$ Q; r, t( ?, A
    .        表示任何单个字符(除换行符) 【注1】       
    8 C: d5 R1 J/ J- U: ], ~( W; u[ ]        字符集,对单个字符给出取值范围,元字符在方括号中不会触发功能        [abc$]表示a、b、c、$,[a--z]表示a到z单个字符4 q9 B: H- @' h4 }/ g
    [^ ]        非字符集,对单个字符给出排除范围        [^abc]表示非a或b或c的单个字符/ A3 M! s# E  V& W& _. H' J5 B
    *        前一个字符0次或无限次扩展 【注2】        abc* 表示 ab、abc、abcc、abccc等
    9 l- k3 a* B4 F# m& K# o+        前一个字符1次或无限次扩展        abc+ 表示 abc、abcc、abccc等
    5 _0 b( }& F# m?        前一个字符0次或1次扩展        abc?表示 ab、abc
      p$ _/ \1 P0 K7 ^|        左右表达式任意一个 【注3】        |abc|def 表示 abc、def
    + a! D- ?* E7 `% O# t/ k{m}        扩展前一个字符m次        ab{2}c 表示 abbc
    / \! M5 ^: p/ x9 [' k( \{m,n}        扩展前一个字符m至n次(含n) 【注4】        ab{1,2}c 表示 abc、abbc
    % ]6 G% _9 `5 N^        匹配字符串开头        ^abc 表示abc且在一个字符串的开头
    0 O7 o4 `0 Q7 [4 }1 K$        匹配字符串结尾        abc$ 表示abc且在一个字符串的结尾
    " k  K' y, ?& T, b( )        分组标记,内部只能使用 | 操作符        (abc) 表示abc,(abc|def) 表示 abc、def
    : ^. k: i# d# ~+ b) ^\        后边跟元字符去除特殊功能,跟普通字符实现特殊功能,如需消除反斜杠的特殊功能只需在前面再加一个反斜杠\\        \d \w \u1 y" b  O; @' P( Q7 m
    \d        匹配十进制数字,等价于[0--9]       
    * ]2 d& g; c" h! h  S\D        与 \d 相反,匹配非十进制数字的字符,相当于 [^0-9]       
    ! p1 h! @8 _" y# s\s        匹配空白字符(包含空格、换行符、制表符等),等价于 [ \t\n\r\f\v]        : s! o  s  a: b, U: G
    \S        与 \s 相反,匹配非空白字符,等价于 [^ \t\n\r\f\v]        ) n% |3 V# ^$ W' r5 X
    \w        单词字符 【注5】 ,等价于[A--Z,a--z,0--9]       
    9 O9 x# j$ Y, L  E* R' f- m( b% Z\W        于 \w 相反        8 N! d# p, x  z- g, ]
    \b        匹配单词的开始或结束        * |- K9 P9 k  B: u  ]5 O4 o
    \B        与 \b 相反        ; n' y# a$ _, b" E: d
    \Z        只匹配字符串的结束位置。        # o- v$ S) b0 B4 Y0 i
    【注1】:如果设置了 re.DOTALL 标志,. 将匹配包括换行符在内的任何字符。
    ! |& |# y5 L  _9 s0 @. V: q, k8 i" Y' Y- I8 O4 q
    【注2】:由于受到 C 语言的 int 类型大小的内部限制,正则表达式引擎会限制字符重复个数不超过 20 亿个;' ?, O+ b4 O4 ]: X: F

    4 `8 i7 s& H- p4 N  f; \1 r【注3】:为了能够更加合理的工作,| 的优先级非常低。例如 banana|orange 应该匹配banana 或 orange,而不是匹配 banan,然后一个 ‘a’ 或 ‘o’。同样,我们使用 \| 来匹配 |字符本身;或者包含在一个字符类中,像这样 [|]。, l/ H$ W" \! A% o

    3 n! _6 `# v/ q5 \& \/ C3 F. y  B# q! I【注4】:可以省略 m 或者 n,引擎会假定一个合理的值代替。省略 m,将被解释为下限 0;省略 n 则会被解释为无穷大(事实上是上边我们提到的 20 亿)。
    9 k# W2 V' U8 B/ D7 [- H: Z/ _6 \+ ?0 c( B$ A- P
    【注5】:\w 匹配任何字符。如果正则表达式以字节的形式表示,这相当于字符类 [a-zA-Z0-9_];如果正则表达式是一个字符串,\w 会匹配所有 Unicode 数据库(unicodedata 模块提供)中标记为字母的字符。你可以在编译正则表达式的时候,通过提供 re.ASCII 表示进一步限制 \w 的定义。
    / j6 Y# Q; I3 ~
    1 g4 @+ T6 _$ Y! @" _. {3. 部分元字符应用详解2 b3 {! Z. s$ d" v0 I% A3 ?

    ( B* I4 c1 T/ p' C4 j/ U( F% ?^# Y& e& Q: X6 V+ N: L  C; V
    " Q' C7 w" C  d+ @
    匹配字符串的起始位置。如果设置了 MULTILINE 标志,就会变成匹配每一行的起始位置。在 MULTILINE 中,每当遇到换行符就会立刻进行匹配。
    ' ~6 I) ^! V/ e6 m
    2 N& `( N/ l9 }: Z0 M. _举个例子,如果你只希望匹配位于字符串开头的单词 From,那么你的正则表达式可以写为 ^From:% K0 R3 X: K9 Q* J4 s8 J

    , t+ Y. N% _% F7 k) ?print(re.search('^From', 'From Here to Eternity'))  4 g8 ~2 a* r- U
    print(re.search('^From', 'Reciting From Memory'))
    : W( q; _& `( V6 g- d1 V- O1
    : N8 j3 R& Y6 e: \1 n; ~  Y2
    # o' `" \$ n9 }1 z+ ?+ m结果如图:
    6 ~2 X& d! v2 B3 t5 i# F6 n# T/ J
    # G' J# P3 V' w( \  P* V0 z
    8 W& S5 ~  a2 Z. N$
    3 n' ^) o# n6 ]% z# x- p6 V8 z/ b  T+ i' \  u
    匹配字符串的结束位置,每当遇到换行符也会离开进行匹配。' k6 ]" Q* D  z) {& @4 Q8 y

    - ]' Y1 g& ]4 U$ [# C6 T6 y9 Gprint(re.search('}$', '{block}'))  7 c) ?0 t( Z# ]0 V
    % ^& _) X, H2 B- z& D
    print(re.search('}$', '{block} '))
    , X3 r2 I' A/ p- Q& {6 ]% M% N0 |2 b
    print(re.search('}$', '{block}\n'))  
    3 t2 v, k3 \, _' }1
    " V+ c' h$ m/ C7 ~: k; a: H28 X- X4 ^% _+ M
    3
    : d, E+ x5 O% K( U4
      _* x) n) N9 P& [% q. ?5: A+ M# X+ E# Z
    结果如图:
    ; y( J. k  z4 [. F
    , x! q7 I1 q  K7 X' p* R# u  i- [
    1 `: o$ ~9 A" y6 a$ X& F% a
    & O( K  Q. T$ Z1 z同样,我们使用 $ 来匹配 $字符本身;或者包含在一个字符类中,像这样 [$]。
    4 G  o1 i" w" R) I; ]- z- G! t0 a% @: A6 `* ^9 N! ^
    \A
    4 X! |' w, g% A3 ]3 I1 I' S' V$ P+ W+ L! l: n+ k( {
    只匹配字符串的起始位置。如果没有设置 MULTILINE 标志的时候,\A 和 ^ 的功能是一样的;但如果设置了 MULTILINE 标志,则会有一些不同:\A 还是匹配字符串的起始位置,但 ^ 会对字符串中的每一行都进行匹配。
    / g: Q0 A* n. `+ L& U' A+ \4 u' h' }. i7 k- }+ e4 D2 e; o
    \b
    # k1 y  u4 {7 h) y# ^9 s4 f1 b% D8 W
    单词边界,这是一个只匹配单词的开始和结尾的零宽断言。“单词”定义为一个字母数字的序列,所以单词的结束指的是空格或者非字母数字的字符。8 Y) ^  L1 K& ]6 D; R) ?( v5 T4 k
    ; K6 Y7 a, j7 D  I' ^
    零宽断言相关信息请点击零宽断言查看。
    % x+ R6 m& S1 T' J
    ' C% l8 E# U. O7 g; a. O下边例子中,class 只有在出现一个完整的单词 class 时才匹配;如果出现在别的单词中,并不会匹配。
    * R7 h7 E- O; x  w2 I( {& l. ~4 F, F0 Q  c0 p; F
    p = re.compile(r'\bclass\b')5 h5 @) a* i4 g: Z* O% Q2 T& A
    print(p.search('no class at all'))  % I- {3 o$ k% W$ }& D( s/ u0 {
    ( k+ ^: p" ^) O2 c+ m/ P* T
    print(p.search('the declassified algorithm'))
    % A5 }% t% ^! M. W  X2 k. p) G8 \2 L$ k
    print(p.search('one subclass is'))$ ], t1 i" ?* @* f
    1
    9 f; v9 I8 V/ C& j2
    " Y2 l  P7 K2 f9 E3* O, {; j( \) ~  k
    4
    5 @( \6 E" b5 V6 ]' t! X$ ?5
    - X; _$ z4 f$ T7 N2 s8 Y6 q6
    " N% s" o( I+ _0 P$ V. T* c结果如图:6 Z0 H. ~% f* P) M9 p: n4 q) C
    + T) ~. d) f/ f: z1 B5 O. x
    在使用这些特殊的序列的时候,有两点是需要注意的:: B: }4 k+ A* O; _- Z4 r8 o
    ' i. S; |1 m" M5 J8 y. l) b4 q
    第一点是,Python 的字符串跟正则表达式在有些字符上是有冲突的。比如说在 Python 中,\b 表示的是退格符(ASCII 码值是 8)。所以,你如果不使用原始字符串,Python 会将 \b 转换成退格符处理,这样就肯定跟你的预期不一样了。
    : K1 x/ d/ M4 D  r* R相关原理和解决方法点击详情查看。; H" K0 p& l5 I6 C& q7 g( y) b

    * A+ L  h6 u, Y; O1 z第二点需要注意的是,在字符类中不能使用这个断言。跟 Python 一样,在字符类中,\b 只是用来表示退格符。
    2 t" c" T5 r2 g. i# o8 L' G" {. {. j7 T: q  J. @
    \B! J6 t: E# P8 V

    - l; Z, |9 x7 M- }( F2 B另一个零宽断言,与 \b 的含义相反,\B 表示非单词边界的位置。
    9 y: J  Y! D2 T0 \+ T( u3 g
    " ]8 I7 [/ x$ r2 O3 H! @$ |3 F; A+ X3. 正则表达式实例6 z: b, R% ^0 L( ?3 S+ y: I! Z2 J

    1 X. v) U* r. p5 \- c- s  A4 A6 T0 l# O7 i( n/ D% o- H1 m+ T
    经典正则表达式实例7 B+ c4 G' h: B- {( g

    ! S; M, r) j, [匹配IP地址的正则表达式
    8 A/ a& C, _; D+ z* \+ I1 I% n7 b$ _) J3 _- V. H/ Z! c- K3 p6 Q
    IP地址字符串形式的正则表达式(IP地址分分4段,每段0-255) \d+.\d+.\d+.\d+ \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} 不精确
    2 [& a5 |% L% E& I8 S- a- M$ [6 V$ V. H, o9 v0 u4 w( z
    精确写法3 |  T% a0 k# R/ ~4 B9 [
    ! Z) C7 D6 \& V6 {" \0 h
    0--99: [1--9]?\d 100--199: 1\d{2} 200--249: 2[0--4]\d 250--255: 25[0--5]! ~4 n) Q$ V- O- B
    (([1-9]?\d|1\d{2}|2[0--4]\d|25[0--5]).){3}([1--9]?\d|1\d{2}|2[0--4]\d|25[0--5])  s3 ^0 j( v7 L; n; f% c4 J
    原文链接:https://blog.csdn.net/qq_44867435/article/details/1051041778 e3 [8 _6 a* V. i% G+ c2 P

    ) s, x- j3 h" @0 g; w# [) D+ _; w+ j
    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, 2025-8-19 21:58 , Processed in 0.427308 second(s), 51 queries .

    回顶部