- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563382 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174237
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
* k5 N3 W6 `: m) C6 q1 j; lPython爬虫 正则表达式应用详解5 G, n4 I/ b# j" G; V% U
8 m% T. d! j2 w4 [3 \
学习Python爬虫过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。* F8 f p; t1 z8 y F4 K' b- h
+ k, r/ o; V, [1 N) O/ G
—— 正则表达式应用详解 ——
# J4 L3 q+ `. e0 i. U9 T- d
3 D: w2 w8 N- b/ ^/ \. T- B; u# P文章目录6 s7 G. ], e) w% \# j R2 Z9 _
9 l/ Z9 ]% A7 R0 V4 @$ OPython爬虫(二十一)5 E* h9 I- ^ ?, |# `! b2 U7 r I
—— 正则表达式应用详解 ——
# O. O0 E8 h* P8 l& i6 o8 z1. 简介
" p) W/ G7 \/ u- U" L2. 语法$ v- v; k" H# k: E; ~$ Q" {- R$ P i" A
3. 部分元字符应用详解( ?$ f4 @6 U& U8 A
^
4 a5 Y' p! h9 m2 S) m& u2 g$' Z- K+ d# m# ~/ U
\A
& Y! y' V6 ?2 ?# S0 {6 p' g6 e- Y\b
4 H6 `; X; J& }) T! {! j0 \7 g4 X\B+ t# G! Q6 }0 Y+ |4 _9 U* n, v! R
3. 正则表达式实例
' `& S9 I- i+ E$ q$ M% S相关文章:
# D( |' g! P7 N9 b( i1.Python的Re库应用详解(正则表达式的库)/ ? q* J% N/ L1 p
2.Python的Re库与正则表达式的细节解析(正则表达式的库); Y \& T: V& E. A9 U# n5 ]! F2 p
; C& D3 d6 H% S3 [7 V' _1. 简介
) H; x* }7 J8 l+ A+ f! j: F5 U+ P8 h' m) D" ]: P! q& l5 e) d& z
正则表达式:regular expression,也称regex,简称 RE) V: C, J X& _0 q4 X& r& e
6 \( Z q H9 [6 H6 T" r* f: A0 Y正则表达式模式被编译成一系列的字节码,然后由一个 C 语言写的匹配引擎所执行。1 P0 y d2 j) E4 A
5 W d4 i) [ m* U% U正则表达式是用来简洁表达一组字符串的表达式$ B: M5 b) o! q; u
6 r5 L5 g: v* R9 g1 p: T
通用的字符串表达框架
5 W& ]; Q6 F) G9 p5 \. X v; h# B1 Z9 {( O: A6 r+ W
简洁表达一组字符串的表达式/ N5 d. D& L* i) L, w7 [% |
1 `" z4 Z g J5 C5 e; K针对字符串表达“简洁”和“特征”思想的工具
! C% O$ w9 b: F% Y6 D' h8 f0 k% I3 m. t' z5 h1 J+ L3 V
判断某字符串的特征归属
. w" [9 `" Q$ c5 j( C' k% {' [+ O
* D8 q* `; e! M正则表达式在文本处理中十分常用
, j9 }+ N% h# p0 y9 E, Q
$ v' u( Q M. A! S4 n' y5 n6 n表达文本类型的特征(病毒、入侵等)* O& |3 ^4 R4 ]- G' [/ ~
2 Q( e6 G& L4 t) q
同时查找或替换一组字符串 A* T9 @: ^6 H7 e
+ o" k/ U4 L6 O% U& L9 D匹配字符串的全部或部分- E) P# d5 }' y" P: ?7 b7 t2 V
$ R7 M1 s7 Y, X5 p; N0 Z1 H
正则表达式的使用+ y; ]3 Y2 s {* @6 }
9 C. o4 K' x) a/ l" P) a2 P6 s+ I
编译:将符合正则表达式语法的字符串转换成正则式表达特征) N# J* S5 J5 E$ u5 @
; y$ l9 Q' D; s* ~: m( _& U
![]()
1 K, A3 e$ [8 Z' R7 K1 \ W2. 语法
2 j3 j9 o* X1 |, d
% S0 u$ z) n O; M正则表达式语法由字符和操作符构成6 h6 |* Z- S3 \, O
' C8 F' d5 `$ c4 _
有一些符号不能匹配自身,它们定义了字符类、子组匹配和模式重复次数等功能,被称为元字符 (metacharacter)。
# G! s/ A, e: Y! g. q元字符包括:. ^ $ * + ? { } [ ] \ | ( )
2 Y2 \7 C. q% r( V6 Z正则表达式的常用操作符! h* R }9 F2 M; M8 ?
在反斜杠后边紧跟着一个元字符,那么元字符的“特殊功能”也不会被触发1 }( Z( J8 X" u% s% j: b! q/ H$ k4 n
操作符 说明 实例$ m p& ?& r/ p
. 表示任何单个字符(除换行符) 【注1】
3 b m$ ^* W' R; y/ g[ ] 字符集,对单个字符给出取值范围,元字符在方括号中不会触发功能 [abc$]表示a、b、c、$,[a--z]表示a到z单个字符) R7 c4 C+ A. C8 R! T7 g$ H
[^ ] 非字符集,对单个字符给出排除范围 [^abc]表示非a或b或c的单个字符
7 a1 M, x( O* m8 v( s' j$ [$ B* 前一个字符0次或无限次扩展 【注2】 abc* 表示 ab、abc、abcc、abccc等 B, G8 S! M5 e [' w( Y) @3 d, {- w
+ 前一个字符1次或无限次扩展 abc+ 表示 abc、abcc、abccc等2 A- D; \; C' p% B2 N; I: t
? 前一个字符0次或1次扩展 abc?表示 ab、abc! a4 M* s/ g1 {0 x% Z
| 左右表达式任意一个 【注3】 |abc|def 表示 abc、def" Q7 d) P1 }# {( {
{m} 扩展前一个字符m次 ab{2}c 表示 abbc
1 b" y& n1 H( j4 P% r g$ t{m,n} 扩展前一个字符m至n次(含n) 【注4】 ab{1,2}c 表示 abc、abbc
& R- F* G% W( u! J; k: | g9 ^1 A^ 匹配字符串开头 ^abc 表示abc且在一个字符串的开头 G0 E3 x$ p# f: D0 R
$ 匹配字符串结尾 abc$ 表示abc且在一个字符串的结尾/ `; F1 E9 `9 {$ q( {/ |+ `
( ) 分组标记,内部只能使用 | 操作符 (abc) 表示abc,(abc|def) 表示 abc、def
$ h$ z, i5 X. | J, o\ 后边跟元字符去除特殊功能,跟普通字符实现特殊功能,如需消除反斜杠的特殊功能只需在前面再加一个反斜杠\\ \d \w \u3 Y' F" W9 Y& m4 M
\d 匹配十进制数字,等价于[0--9]
& [/ e: y( J7 u8 j, d6 B& F3 b\D 与 \d 相反,匹配非十进制数字的字符,相当于 [^0-9]
) W8 F7 t& @# h3 m3 |\s 匹配空白字符(包含空格、换行符、制表符等),等价于 [ \t\n\r\f\v] 9 q' o! F5 A" N) \ y e
\S 与 \s 相反,匹配非空白字符,等价于 [^ \t\n\r\f\v] * E( \( l( ]% z, n
\w 单词字符 【注5】 ,等价于[A--Z,a--z,0--9]
) ]# C ^1 v+ D& {! z\W 于 \w 相反
2 c- q: @ N, [" Y; W4 p) I& ^\b 匹配单词的开始或结束
) U: M; [& \7 J4 U\B 与 \b 相反 / ]' j j7 `$ j/ Y; y9 S' E8 K
\Z 只匹配字符串的结束位置。
0 j9 b; ~ Y. c【注1】:如果设置了 re.DOTALL 标志,. 将匹配包括换行符在内的任何字符。4 {2 ], Y" K+ Y2 B7 I# Y5 W# Z
+ K3 O* D4 Z2 [- S2 o; l+ p【注2】:由于受到 C 语言的 int 类型大小的内部限制,正则表达式引擎会限制字符重复个数不超过 20 亿个;
) x. [; c0 N+ O) |9 p" }6 C. ^' d
【注3】:为了能够更加合理的工作,| 的优先级非常低。例如 banana|orange 应该匹配banana 或 orange,而不是匹配 banan,然后一个 ‘a’ 或 ‘o’。同样,我们使用 \| 来匹配 |字符本身;或者包含在一个字符类中,像这样 [|]。
c- G4 k2 X) Q2 X7 p, N7 S4 \/ L
- V* J6 q2 @9 z6 K: q& Q* M【注4】:可以省略 m 或者 n,引擎会假定一个合理的值代替。省略 m,将被解释为下限 0;省略 n 则会被解释为无穷大(事实上是上边我们提到的 20 亿)。
3 y f$ y! t& {0 U' q! K
+ b* R$ ] u( s, I0 ~& l, r【注5】:\w 匹配任何字符。如果正则表达式以字节的形式表示,这相当于字符类 [a-zA-Z0-9_];如果正则表达式是一个字符串,\w 会匹配所有 Unicode 数据库(unicodedata 模块提供)中标记为字母的字符。你可以在编译正则表达式的时候,通过提供 re.ASCII 表示进一步限制 \w 的定义。7 m" `* B6 K8 X
8 B7 K! O1 q; O
3. 部分元字符应用详解# t" d/ O+ {) v8 B
7 C. w( q2 ^/ @ v^. i% a; o& h8 b" o4 G$ _ `! `
9 C! J9 C# ^% G
匹配字符串的起始位置。如果设置了 MULTILINE 标志,就会变成匹配每一行的起始位置。在 MULTILINE 中,每当遇到换行符就会立刻进行匹配。5 {* X) m4 ~9 v/ ?1 ^$ b
' @. u9 s( X1 H4 p* Q$ [2 c
举个例子,如果你只希望匹配位于字符串开头的单词 From,那么你的正则表达式可以写为 ^From:; ^/ e3 U) e+ _# u; w
3 l$ {) W! {& }5 x( Y+ l5 j9 t" Vprint(re.search('^From', 'From Here to Eternity'))
5 f( @9 U* o* c# r" c7 T7 Yprint(re.search('^From', 'Reciting From Memory'))
b7 Z$ i: \ g+ D( j2 C6 R2 |18 u6 H2 B: E2 @) I. ^& _; \
23 A' q' c( \# Q5 ^3 l: ]1 e
结果如图:
! M/ p) A" E+ F8 t: y![]()
8 A$ x* ?7 F D' K' p; r0 ]- ?: _4 | o: |3 |: W# L- P
$
' w- ^* O. p: N& L2 h- y, R! v& K: A9 ?
匹配字符串的结束位置,每当遇到换行符也会离开进行匹配。, |4 F K# A( R6 a" k; y1 ?
! Z6 ^) i6 X. g% B; pprint(re.search('}$', '{block}')) ' H6 E6 ?# m$ ?+ G
' H9 ~% c5 {2 g" h- r) J
print(re.search('}$', '{block} '))
' `/ \7 J5 N4 C$ N+ ?
! m ^: @$ O6 U$ L/ W, Fprint(re.search('}$', '{block}\n')) 7 X& `7 V: M. Y7 O$ C
10 {) [1 N1 S$ ^* V! D
2
1 u+ M6 g; D* A4 U% Q6 L0 a; [3
) c3 |/ i: x) s9 V* B8 ?: ^/ ~43 H7 j4 j2 \# R! L5 U
59 Q3 q* J3 c* b: D3 O$ P; G! a
结果如图:# e: c6 k! i `" y& R w
* X- \% Z" m& J+ G" K* e! J% J![]()
+ `0 ]; {1 ^6 v+ W8 G& K4 Z
6 }+ x( S* w/ A" j同样,我们使用 $ 来匹配 $字符本身;或者包含在一个字符类中,像这样 [$]。
! l1 T+ e8 O5 J
) T' V$ ?- ^* O4 w\A5 J" F0 ?, x' z" R
4 f# M+ D5 l( u, z9 h6 u只匹配字符串的起始位置。如果没有设置 MULTILINE 标志的时候,\A 和 ^ 的功能是一样的;但如果设置了 MULTILINE 标志,则会有一些不同:\A 还是匹配字符串的起始位置,但 ^ 会对字符串中的每一行都进行匹配。
9 E4 S# k$ P4 E# p( y5 r: j6 m, z8 v# q! m+ O
\b7 S+ p$ P/ t L: U* q! l
0 G; T6 j/ \) ]6 U0 [, u2 S
单词边界,这是一个只匹配单词的开始和结尾的零宽断言。“单词”定义为一个字母数字的序列,所以单词的结束指的是空格或者非字母数字的字符。
3 [: b5 p/ |) i( A3 c4 R! Z. ?& N1 o7 u9 M
零宽断言相关信息请点击零宽断言查看。
: ]5 [: ]! e# R6 l
3 t( C) u% v! U7 g, l: O6 v/ {下边例子中,class 只有在出现一个完整的单词 class 时才匹配;如果出现在别的单词中,并不会匹配。
' j) s* k x% u; E+ ^, y: r8 ?% D; Z
8 b3 p& {7 |; y; \4 ]0 wp = re.compile(r'\bclass\b')4 g4 n( U4 D0 q7 h+ k: w/ Y
print(p.search('no class at all')) 9 j, K; r3 d" L: R7 f
0 l7 l$ k5 d& Q8 t
print(p.search('the declassified algorithm'))
* ]7 s8 N( C5 i0 T
. k+ V& ^6 R4 m# bprint(p.search('one subclass is'))) l9 T/ ~& j6 N! G# |
1
& D( W# w/ c2 p; _& Z" s" t2
" ^8 \- W# `. e35 R/ N9 N6 F' A' b6 E6 b! v
43 O2 X* U9 c9 _: x: |
5
i. w; M, S! }: C" ? M& m8 x: M6
2 x+ }* L {6 |, e, m结果如图:7 P! i( S3 Q5 o; B
! V: j8 `8 c" O6 d! o, k" ?在使用这些特殊的序列的时候,有两点是需要注意的:
3 j- `$ F+ F @5 b5 W, O3 b# F7 P" r
: u/ w* n2 N. k. `第一点是,Python 的字符串跟正则表达式在有些字符上是有冲突的。比如说在 Python 中,\b 表示的是退格符(ASCII 码值是 8)。所以,你如果不使用原始字符串,Python 会将 \b 转换成退格符处理,这样就肯定跟你的预期不一样了。+ s8 _/ T& i' a% k" ?) y' G
相关原理和解决方法点击详情查看。
8 Q; G( C. Z# z ~& [2 p/ j9 v; t9 R# W! v; P
第二点需要注意的是,在字符类中不能使用这个断言。跟 Python 一样,在字符类中,\b 只是用来表示退格符。1 A s, G/ N# b8 U& L
1 q- ^1 J- V4 L2 i2 k( I
\B
) y7 o, Q" }/ K5 ?2 G$ d3 ?! d' p9 ^
另一个零宽断言,与 \b 的含义相反,\B 表示非单词边界的位置。; V3 C: o, E6 W; E t/ ^' c% r
6 P4 a4 L3 A" m' `
3. 正则表达式实例
0 h( ~$ N/ W B$ \ 1 w4 R) O. G0 V. P. D0 L
, x, q g- [+ f" k* Q经典正则表达式实例& A" V+ E8 g/ n% q l. v: T
* m# a; p5 ~" G3 S: T
匹配IP地址的正则表达式
0 W3 |3 L" R6 U5 q8 I5 ^$ p' w
IP地址字符串形式的正则表达式(IP地址分分4段,每段0-255) \d+.\d+.\d+.\d+ \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} 不精确) G( U4 T: P, Q) b# A9 m$ M
! {+ I1 }* A! U5 A# _' E' B精确写法
- i: K1 g; f0 N( X% F3 ]; [& [. _* A ~# o# c& u9 ~1 [! N- b2 r
0--99: [1--9]?\d 100--199: 1\d{2} 200--249: 2[0--4]\d 250--255: 25[0--5]* H$ a' F+ M1 l- w9 R" I
(([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])
/ _" H- h( T: v' T+ w* |/ \' {原文链接:https://blog.csdn.net/qq_44867435/article/details/1051041777 d. i8 J# f+ R! ]( m3 ?2 L% }
+ W, p; k2 B) w
& w" ~. l. b9 }- z; T |
zan
|