QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2672|回复: 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
    $ Y9 R1 Y$ M: h* J8 ~8 b, w( d) d
    Python爬虫 正则表达式应用详解2 z7 |! \! L' L/ ]6 z

    1 z0 K6 `5 F6 U' @( A* K学习Python爬虫过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。
    , a  t& T  y) I# q" u  d
    # ~9 z  l! m) _9 J; c2 ?" c- k7 \—— 正则表达式应用详解 ——
    + L8 u1 h$ Y! s1 G
    + u4 v2 ^1 G$ t) r文章目录
    5 c' t$ i2 l( X2 U+ F4 w
    ' V* d/ @" P; j: T/ m# \& I0 JPython爬虫(二十一)
    6 k( {4 E; j3 c7 s9 F# p—— 正则表达式应用详解 ——" ]$ P" H  {# T* c$ G  K' ]) y
    1. 简介
    6 o* K* s9 V, E: Q9 x: S2. 语法
    ) }, }# S/ V" h3. 部分元字符应用详解
    9 f6 x9 b/ [1 a: ?  E^: D# O. F8 g$ B' y" S+ K, J
    $+ h3 t/ A! {! k8 h
    \A) q! b$ _' j0 `! i
    \b
    & U. A2 e) x, q: `3 r\B
    1 `3 ?+ Q- C) J) f* i1 ^3. 正则表达式实例
    4 W0 `4 H  O4 u相关文章:! K; {+ a- m5 Y8 p
    1.Python的Re库应用详解(正则表达式的库)
    - W! `! i- w/ X0 T5 l* b2.Python的Re库与正则表达式的细节解析(正则表达式的库). C8 I9 Y, Y/ x; e7 |9 t2 T$ O
    4 K( ?% y0 W7 H$ U
    1. 简介
    , e. F8 X5 a# p  v1 J& I7 n# l' o3 ^* ?
    正则表达式:regular expression,也称regex,简称 RE4 M6 j4 S3 R! y0 Q! |4 w

    & b3 e. S% S! k4 r1 s正则表达式模式被编译成一系列的字节码,然后由一个 C 语言写的匹配引擎所执行。
    # N8 C- D2 H. z8 x' M- Z8 o4 m
    % v3 Y! n4 n9 d# \; j1 r6 J正则表达式是用来简洁表达一组字符串的表达式
      V2 V! Q) B* O/ `* S
    1 C0 e1 j, \  W- F+ q$ f通用的字符串表达框架1 O4 F/ k  v/ O+ S. c$ l& @

    9 K5 v: D" U- P5 {简洁表达一组字符串的表达式9 E3 s/ @4 P* H
    / x6 b. x9 w5 F; F/ {& O- [
    针对字符串表达“简洁”和“特征”思想的工具" q3 g/ A, S# {2 h; R$ b

    ' @) s. E% K! l5 N8 B: p  r判断某字符串的特征归属9 J: x7 b2 T# ~6 {% _3 y
    ! c; Y; V9 a' P: v% m
    正则表达式在文本处理中十分常用
    ) U* A1 ~  z# h; E  J3 q0 E
    . x  C' k3 s2 G% W2 Z表达文本类型的特征(病毒、入侵等)3 Z% Y+ O9 s& l- M$ X7 D
    * x# b( r7 G7 `  U
    同时查找或替换一组字符串4 W# ]; s  X( w0 D0 n

    & u% `0 K) U: E1 H$ ^  j/ S* Q匹配字符串的全部或部分
      G2 y& b1 X, b- Y; W7 R% r2 {8 Q( q2 V. N+ N
    正则表达式的使用; X; ]2 F. C& b( T$ |2 B$ f6 m: }
    9 ?  ]6 l4 k+ M1 d9 m$ Q
    编译:将符合正则表达式语法的字符串转换成正则式表达特征7 K# M, ^  M% f, S( i
    / h6 @5 ~) c! H, m- e+ t  T
    ( ^: p( t* d& k
    2. 语法) p0 V! s& }, b' _& L# k
    % D9 Q4 @# v6 M/ z4 W" a
    正则表达式语法由字符和操作符构成
      Y# `/ E2 d% Z9 r  P. H) ~6 r: a. {7 O; d( Q9 j5 v
    有一些符号不能匹配自身,它们定义了字符类、子组匹配和模式重复次数等功能,被称为元字符 (metacharacter)。
    , Z3 u0 ~! P( i元字符包括:. ^ $ * + ? { } [ ] \ | ( )
    ! S/ v/ s( A3 A' f' C正则表达式的常用操作符
    ) D6 z# b+ K7 ^; R2 a) w, n1 S在反斜杠后边紧跟着一个元字符,那么元字符的“特殊功能”也不会被触发
    . p* ^# ~6 |% Z操作符        说明        实例
    : i; O1 T. K% h* L: p/ c.        表示任何单个字符(除换行符) 【注1】        ! H$ J" ?- @) R2 o7 L! l
    [ ]        字符集,对单个字符给出取值范围,元字符在方括号中不会触发功能        [abc$]表示a、b、c、$,[a--z]表示a到z单个字符
    2 e: b" K8 Q' d[^ ]        非字符集,对单个字符给出排除范围        [^abc]表示非a或b或c的单个字符. d; Q# h' G$ O" `" a
    *        前一个字符0次或无限次扩展 【注2】        abc* 表示 ab、abc、abcc、abccc等% P- L( C5 v9 q
    +        前一个字符1次或无限次扩展        abc+ 表示 abc、abcc、abccc等
    + k. @' R) p/ u?        前一个字符0次或1次扩展        abc?表示 ab、abc2 v& ]  t0 \0 d
    |        左右表达式任意一个 【注3】        |abc|def 表示 abc、def6 @6 e0 A5 d" E) E" A0 X
    {m}        扩展前一个字符m次        ab{2}c 表示 abbc6 N9 K: s% `8 {& x& [, b
    {m,n}        扩展前一个字符m至n次(含n) 【注4】        ab{1,2}c 表示 abc、abbc
    ) P. [& m* @) y" z8 k7 C' ?1 f^        匹配字符串开头        ^abc 表示abc且在一个字符串的开头  O- h8 E! w$ h# {2 k$ I# _
    $        匹配字符串结尾        abc$ 表示abc且在一个字符串的结尾
    ' s" D( W: T0 |( )        分组标记,内部只能使用 | 操作符        (abc) 表示abc,(abc|def) 表示 abc、def, A7 T% \2 n) j$ Q# \1 ]
    \        后边跟元字符去除特殊功能,跟普通字符实现特殊功能,如需消除反斜杠的特殊功能只需在前面再加一个反斜杠\\        \d \w \u
    ' G6 R: i1 d" T8 O\d        匹配十进制数字,等价于[0--9]        6 o' g8 q; t- c: T9 R8 |
    \D        与 \d 相反,匹配非十进制数字的字符,相当于 [^0-9]       
    " v5 l' R7 S1 _( ~+ m0 v\s        匹配空白字符(包含空格、换行符、制表符等),等价于 [ \t\n\r\f\v]       
    0 a, g5 z; J% x9 \\S        与 \s 相反,匹配非空白字符,等价于 [^ \t\n\r\f\v]        7 F; n4 `4 B5 z' {
    \w        单词字符 【注5】 ,等价于[A--Z,a--z,0--9]       
    9 v" J8 X# n1 L  O% y- ?* K\W        于 \w 相反       
    6 u6 k* h) d% m: K5 h( s\b        匹配单词的开始或结束        , Z; _6 i  G4 A3 t9 M8 w
    \B        与 \b 相反       
    : Q$ ?9 n; W) g2 [; E\Z        只匹配字符串的结束位置。        5 e8 m8 c# s, N" a
    【注1】:如果设置了 re.DOTALL 标志,. 将匹配包括换行符在内的任何字符。
    0 `3 ]  }, j5 S& }2 Y( e6 t2 ~: `! _
    【注2】:由于受到 C 语言的 int 类型大小的内部限制,正则表达式引擎会限制字符重复个数不超过 20 亿个;
    7 C7 I; u$ I1 |$ l+ A+ S8 w6 \; p: l6 D8 u+ {. C- i# U+ f
    【注3】:为了能够更加合理的工作,| 的优先级非常低。例如 banana|orange 应该匹配banana 或 orange,而不是匹配 banan,然后一个 ‘a’ 或 ‘o’。同样,我们使用 \| 来匹配 |字符本身;或者包含在一个字符类中,像这样 [|]。
    6 @3 Q+ l8 U; {4 ~/ l& |5 X, D. ^
    # |3 w9 D# s" c* s【注4】:可以省略 m 或者 n,引擎会假定一个合理的值代替。省略 m,将被解释为下限 0;省略 n 则会被解释为无穷大(事实上是上边我们提到的 20 亿)。3 V, \( ~6 U0 |7 w' D

    ; C- a) E2 h% R7 J( t【注5】:\w 匹配任何字符。如果正则表达式以字节的形式表示,这相当于字符类 [a-zA-Z0-9_];如果正则表达式是一个字符串,\w 会匹配所有 Unicode 数据库(unicodedata 模块提供)中标记为字母的字符。你可以在编译正则表达式的时候,通过提供 re.ASCII 表示进一步限制 \w 的定义。- e+ H  C  W1 r( }5 S% a
    % o& v0 @$ U) j* M. C" g
    3. 部分元字符应用详解  r$ w/ Z4 N3 [4 a

    " o! P* F; X: I( _2 O^
    ' d7 Q; ~2 O) P3 l2 A* O5 {/ O( s( I
    匹配字符串的起始位置。如果设置了 MULTILINE 标志,就会变成匹配每一行的起始位置。在 MULTILINE 中,每当遇到换行符就会立刻进行匹配。. N4 X0 y/ a( F1 w1 ~

    . L7 ~' G# X4 B6 G4 r1 g1 Q举个例子,如果你只希望匹配位于字符串开头的单词 From,那么你的正则表达式可以写为 ^From:
    6 p* i* Q4 r5 c  |
    * Z5 F% C/ C$ A5 jprint(re.search('^From', 'From Here to Eternity'))  
    3 L+ s, B3 l7 _+ {- `# O; H8 d8 \print(re.search('^From', 'Reciting From Memory'))
    $ g. O3 }% l- A2 _, [13 L* I1 c$ p7 e- I2 u; b. ^
    2
    9 c9 O! F( j- E结果如图:
    : l7 A9 {* v3 t4 B
    3 A* h7 I+ W  M: V: }' a+ i( r$ f5 p- _" [
    $' |  L4 ?; ?& K* m  M  R" ]. [
    # n3 e5 Z: M9 e
    匹配字符串的结束位置,每当遇到换行符也会离开进行匹配。
    * B& j2 ]* [& O" y* c: `( [$ o
    8 h, w- Y. @, l$ iprint(re.search('}$', '{block}'))  
    5 ?; B0 v' Q% A/ {: h$ w: v1 g* w! F% e! M* `
    print(re.search('}$', '{block} '))& [! Y$ B2 m8 n  q- S1 i4 u0 K
    ) ]8 E  m) w6 d# M, B) X$ A" X; }
    print(re.search('}$', '{block}\n'))  : l, Q1 u2 r* U  l
    1
    8 D  M  v- z" N- W7 S# _) W26 ~7 B& D% P! Z* k  c+ `4 _
    3) T( b& k; o% t0 J7 f% h$ e9 `2 J
    45 o0 ?/ O' j2 ^4 R' q3 p% O
    5
    : {% b9 H9 h+ }) P& b( O: V- i4 s结果如图:! I/ s: V) l0 M+ v! _
    / P0 D! a8 }! _; R2 m

    2 K  ?1 |' ]8 Q5 V8 s. m% K: N( p/ ~$ P& {. }4 x( `
    同样,我们使用 $ 来匹配 $字符本身;或者包含在一个字符类中,像这样 [$]。
    2 F6 F+ w  l* H- X: K) P7 I, C9 ~
    + K- x7 D3 @' v\A0 \+ y% Z7 W: e: G+ q+ [
    , B; o! h) z5 F3 N
    只匹配字符串的起始位置。如果没有设置 MULTILINE 标志的时候,\A 和 ^ 的功能是一样的;但如果设置了 MULTILINE 标志,则会有一些不同:\A 还是匹配字符串的起始位置,但 ^ 会对字符串中的每一行都进行匹配。) |5 S! O/ f/ }

      @0 q9 r2 l& J' }& a! ~. `\b, O0 e2 o" k5 i  L

    # v2 X0 O  r8 i- M  o/ [/ R! Q单词边界,这是一个只匹配单词的开始和结尾的零宽断言。“单词”定义为一个字母数字的序列,所以单词的结束指的是空格或者非字母数字的字符。
    9 X8 O+ r/ U$ V) r" _( M5 E# g7 m% i, @: ~: S  Y7 S
    零宽断言相关信息请点击零宽断言查看。
    4 z" Y# A% I, [3 w/ T7 B& F, ?# N# ^, [2 o0 @8 l) S7 O5 O9 b) L
    下边例子中,class 只有在出现一个完整的单词 class 时才匹配;如果出现在别的单词中,并不会匹配。6 ^: s9 j8 q% L0 z/ f3 I

    * J8 x8 ^: C7 p: N' Yp = re.compile(r'\bclass\b')
    3 o* k, W9 r& a( L' F3 qprint(p.search('no class at all'))  
    8 I- `: c8 j( R  ]3 k! T% i+ L% m, b7 A* r- P; D- |' g7 Z  L
    print(p.search('the declassified algorithm'))
    * t$ B/ }/ d7 r; S* q# w) E% Z5 c7 x
    # G/ l. }/ E3 U: J" |; t" m& `print(p.search('one subclass is'))
    - G- H/ d" y& a; }1
    7 ~" h2 }3 w$ ?* k. X" c1 s23 k. T1 M5 z% `9 `" j
    3
    , D" u' {7 P$ _4* z1 ~; F* J  y8 X, @$ \
    52 E' ]9 E; b/ g4 l$ J3 F
    6
    / U: r" f- F" \6 [0 Y1 |结果如图:
    6 ~/ s) k* o9 e% L& p6 X9 A! n4 T5 Z- m/ I" k- S; d1 U
    在使用这些特殊的序列的时候,有两点是需要注意的:5 r0 R8 H. K' m4 o2 a
    * q1 F0 C, j& W
    第一点是,Python 的字符串跟正则表达式在有些字符上是有冲突的。比如说在 Python 中,\b 表示的是退格符(ASCII 码值是 8)。所以,你如果不使用原始字符串,Python 会将 \b 转换成退格符处理,这样就肯定跟你的预期不一样了。( @& k+ e6 a' p: K8 k
    相关原理和解决方法点击详情查看。) O, \; ]( I! z- `4 Z! g

    . J% D: H& {1 T  K- O) p1 [# y( _第二点需要注意的是,在字符类中不能使用这个断言。跟 Python 一样,在字符类中,\b 只是用来表示退格符。
    ) v+ ]3 X' F- I( S: `1 D
    * ]/ G% P2 k" |; @9 n& e\B4 C- E3 {; V  e) d" f! J) v

    5 l/ ], X: k* S# [$ D. X另一个零宽断言,与 \b 的含义相反,\B 表示非单词边界的位置。
    ; V' J( X3 C( c1 y& A. G# r9 J: {$ n" n
    3. 正则表达式实例
    $ A* `8 G: X6 h
    ( A$ Y- A% o* `4 h2 q5 R8 u* t7 @/ I  `; l9 [$ G, z
    经典正则表达式实例
    ( ?- ^  S4 r& _
    * ^4 C/ y# ~* y8 y5 X, g' `" w匹配IP地址的正则表达式# M1 o/ k' C9 Y+ r

    / g) s  t3 a* U3 {8 t4 }IP地址字符串形式的正则表达式(IP地址分分4段,每段0-255) \d+.\d+.\d+.\d+ \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} 不精确* x  Y+ E2 T5 T

    5 J2 H8 U4 ~! ~5 y3 v精确写法
    " o9 r& h8 @/ K% [9 j$ Y
    3 {! K% y2 h7 y) A, K, u0--99: [1--9]?\d 100--199: 1\d{2} 200--249: 2[0--4]\d 250--255: 25[0--5]; J) d$ ?; A' v; F
    (([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])
    9 n% o+ K) d  ?9 ^$ Y  M  X8 F原文链接:https://blog.csdn.net/qq_44867435/article/details/1051041771 d% O( }/ _$ y" n+ J
    * O8 p7 d7 a" A
    5 Q# T2 Q/ |4 N- I7 p& V9 _
    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 18:56 , Processed in 0.390867 second(s), 50 queries .

    回顶部