京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2386|回复: 0

Python正则表达式保姆式教学详细教程

[复制链接]

22

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2021-11-15 07:42:33 | 显示全部楼层 |阅读模式 来自 中国
目录/ J: y- n0 n1 d/ \( g

7 t7 K: L' V- _, m

    ) G- H( a1 Y; n1 w# m) i$ R2 H+ w+ ]8 [( S
  • 一、re模块
    , Q3 G2 Y  b! H( [$ s

      2 W6 ~( h4 j7 U. ^0 L9 U0 {. H' M! e  v
    • 1.导入re模块
      " J3 V2 b( s% j5 R) t& }- A- K
    • 2.findall()的语法:% V0 W, v4 Z; y: q

    % \5 i2 P, R1 O& A3 v
  • 二、正则表达式
    3 o6 o8 \0 J. _: _% V: j
      2 a# t# |! r, E' }/ ~  ?  r3 \9 w
    • 1.普通字符6 C& ]( h) w7 h  \$ J/ M) J' i+ e6 v
    • 2.元字符7 H) o# i7 b8 M  E# I2 ]( S

    / u/ @$ }+ P1 R
  • (二)正则的使用3 l( X8 ^$ m" l% u! ]! `4 b& P" O

      + ?  y! K1 n% o1 W! x3 ^
    • 1.编译正则& p! K, }( }9 P
    • 2.正则对象的使用方法+ L% |7 I* f' j4 }
    • 3.Match object 的操作方法/ g8 T; ?! q- N* w% E  ]. G) b
    • 4.re模块的函数( o8 O# g& g6 @+ t, F

    . E1 g0 U! D3 Y+ Q: d1 p- m6 R
正则作为处理字符串的一个实用工具,在Python中经常会用到,比如爬虫爬取数据时常用正则来检索字符串等等。正则表达式已经内嵌在Python中,通过导入re模块就可以使用,作为刚学Python的新手大多数都听说”正则“这个术语。
7 f# Y3 R6 v3 B) x今天来给大家分享一份关于比较详细的Python正则表达式宝典,学会之后你将对正则表达式达到精通的状态。
( E1 |$ L- S( g, o" R
8 _" b7 j; X: ?5 n. q

/ q: [: ?% S4 H* P3 p3 Y一、re模块# j: L; H0 j2 ]' [/ u  C

+ R: S# L3 r) t1 J9 v在讲正则表达式之前,我们首先得知道哪里用得到正则表达式。正则表达式是用在findall()方法当中,大多数的字符串检索都可以通过findall()来完成。
- u  \# g* X/ M# }5 G, _, h5 k0 j8 `7 c0 P. q$ I0 S) X
1.导入re模块- D/ b1 F2 P0 y

) R% Q; ^- d1 R; f& t
2 K* x9 c. l( k: i* w" E8 r在使用正则表达式之前,需要导入re模块。) ?9 ?% S& ~- J# A1 T) Q7 Z6 c8 o/ }
import re 
6 Y! r5 }; w. J) g+ Z

, y5 U" m: Z( g2.findall()的语法:. z' B0 h& S8 o

; O0 I( O7 }: f导入了re模块之后就可以使用findall()方法了,那么我们必须要清楚findall()的语法是怎么规定的。% F& T7 X1 C0 s
findall(正则表达式,目标字符串)( O8 p" h' a3 M
不难看出findall()的是由正则表达式和目标字符串组成,目标字符串就是你要检索的东西,那么如何检索则是通过正则表达式来进行操作,也就是我们今天的重点。
) D2 j# U, x) x# ?% ~  l使用findall()之后返回的结果是一个列表,列表中是符合正则要求的字符串: o8 y5 R3 B2 Z( F
1 n9 ?5 X6 c9 h2 V* f. g# y
二、正则表达式( j) `* K3 h2 t  T2 [6 C! _

- J$ h9 o. _0 j  O; P% R(一).字符串的匹配+ `. g$ Y+ R* L( Y7 q. b
% w! e/ |  U2 J1 G9 d' n- r
1.普通字符
1 s/ ^+ C: {- R9 N1 _  \8 [+ R  X
# A3 T! N7 A# f6 V' }- e: t/ Q
, D! m. P4 [: A% B. X+ D
大多数的字母和字符都可以进行自身匹配。
  1. import rea = "abc123+-*"b = re.findall('abc',a)print(b)
复制代码
输出结果:
& }* y+ T7 Q& i8 A; t' {
['abc']  F$ C8 l$ {: T! l7 f3 e
5 J, R7 e: K0 B1 l3 V5 s
2.元字符
: r. J  @, k" j
4 F- u% p: \, l  Z元字符指的是. ^ $ ? + {} \ []之类的特殊字符,通过它们我们可以对目标字符串进行个性化检索,返回我们要的结果。
/ @/ O# k. K* e这里我给大家介绍10个常用的元字符以及它们的用法,这里我先给大家做1个简单的汇总,便于记忆,下面会挨个讲解每一个元字符的使用。) p; D' A# N3 K$ w: K8 w4 [. o

2 Z6 A0 ~% N5 S( O2 t/ K1 g6 j(1) []
2 e, h) n/ z1 |4 K[] 的使用方式主要有以下三种:5 o- q& g8 V3 [
常用来指定一个字符集。
  1. s = "a123456b"rule = "a[0-9][1-6][1-6][1-6][1-6][1-6]b"        #这里暂时先用这种麻烦点的方法,后面有更容易的,不用敲这么多[1-6]l = re.findall(rule,s)print(l)
复制代码
输出结果为:- y9 ~* m5 b9 K. }% h
['a123456b']! ]! O- w% e: p; y* b( }
可以表示一个范围。/ j% \' X3 ?5 O
例如要在字符串"abcabcaccaac"中选出abc元素:
  1. s = "abcabcaccaac"rule = "a[a,b,c]c"  # rule = "a[a-z0-9][a-z0-9][a-z0-9][a-z0-9]c"        l = re.findall(rule, s)print(l)
复制代码
输出结果为:5 E2 `/ Q$ o) ^4 F3 t: c& x+ `& a
['abc', 'abc', 'acc', 'aac']8 H5 b* }) v& e% L. ^' ?, `" n
[] 内的元字符不起作用,只表示普通字符。# y' o+ |; o# t8 @/ t" H
例如要在字符串“caabcabcaabc”中选出“caa”:
  1. print(re.findall("caa[a,^]", "caa^bcabcaabc"))
复制代码
输出结果为:
( Q; F2 e7 p4 o+ W, d  v
['caa^']& A& u! w% L7 F5 m/ a
注意点:当在[]的第一个位置时,表示除了a以外的都进行匹配,例如把[]中的和a换一下位置:
  1. print(re.findall("caa[^,a]", "caa^bcabcaabc"))
复制代码
输出:
. h' M, a* E4 R! P- r
['caa^', 'caab']. S% n- [5 N# \" p! a' _' `9 J$ ?
(2)^
) \% J& |: u& Y: B) t% H7 x, _^ 通常用来匹配行首,例如:
  1. print(re.findall("^abca", "abcabcabc"))
复制代码
输出结果:" _0 z/ }% W3 `9 C! F2 S6 I
['abca']
! O) R* x% G) P2 f; o% E6 K. b' a

, S0 _' w; L3 }+ B3 m7 ^(3) $
: Q" o: s- x2 P' Z$ 通常用来匹配行尾,例如:
  1. print(re.findall("abc$", "accabcabc"))
复制代码
输出结果:
7 U) @, @/ t$ z9 D+ K$ K
['abc']7 I! F$ E4 t. L: @$ j. f& s* e1 [3 a

9 ^$ d& X0 N. p3 l6 Z) c(4)\
0 N' L) |: \1 s​ 反斜杠后面可以加不同的字符表示不同的特殊含义,常见的有以下3种。/ x3 }& u! ?0 K
\d:匹配任何十进制数等价于[0-9]
  1. print(re.findall("c\d\d\da", "abc123abc"))
复制代码
输出结果为:
% U2 }8 C+ k, b  N7 Y' i( k( D
['c123a']# N- u  l" @1 g8 A" [: `
\可以转义成普通字符,例如:
  1. print(re.findall("\^abc", "^abc^abc"))
复制代码
输出结果:
. q! v3 u* C) D( ?
['^abc', '^abc']! A4 }' ]  U6 h
s
8 ~- y1 d' {. ^9 J# q1 ?: W! O; f' F匹配任何的空白字符例如:
  1. print(re.findall("\s\s", "a     c"))
复制代码
输出结果:
: V/ w0 p: j8 ^$ w% z3 i9 N" G' s
['  ', '  ']
3 [+ t- M; C! d( n' M
\w2 C7 b& x( m: d2 J/ }  ]
匹配任何字母数字和下划线,等价于[a-zA-Z0-9_],例如:
  1. print(re.findall("\w\w\w", "abc12_"))
复制代码
输出:. I/ `5 Z/ D1 `2 X. Q
['abc', '12_']8 o. I; I1 ]# b+ C
8 u- w! U( M( d$ G$ g/ o" \' M8 Z: W+ F
(5){n}: k) I5 l" Y) |& a" R
{n}可以避免重复写,比如前面我们用\w时写了3次\w,而这里我们这需要用用上{n}就可以,n表示匹配的次数,例如:
  1. print(re.findall("\w{2}", "abc12_"))
复制代码
输出结果:: L8 v; O( I3 x* H' D
['ab', 'c1', '2_']
/ Q- [$ W8 |! D; Q" l; k! ]
(6)*' S; x: @, o/ z1 I2 f
*表示匹配零次或多次(尽可能的多去匹配),例如:
  1. print(re.findall("010-\d*", "010-123456789"))
复制代码
输出:1 H/ D" Q* f) e5 X% Q$ _
['010-123456789']
1 T: p, n! |" p* V( D' i! O: K
**(7) + **$ P6 x, {6 I1 F9 v! c7 H' {
+表示匹配一次或多次,例如
  1. print(re.findall("010-\d+", "010-123456789"))
复制代码
输出:2 T2 A, Z* t+ l- ~- k
['010-123456789']6 |% B1 B  p6 d/ L( n! [0 u
(8) .
4 C6 |7 D% f9 ?- w1 V8 @& d% l.是个点,这里不是很明显,它用来操作除了换行符以外的任何字符,例如:
  1. print(re.findall(".", "010\n?!"))
复制代码
输出:7 \# O4 m! Y- N' |8 z" F
['0', '1', '0', '?', '!']
* C% z. T, g5 h7 z+ A" Y, {' c
(9) ?
" s8 X$ e9 B4 R9 _?表示匹配一次或零次
  1. print(re.findall("010-\d?", "010-123456789"))
复制代码
输出:
1 T4 ?9 y3 k) @3 s& R
['010-1']
# H' z; ~5 z2 I. S% }' C# X
这里要注意一下贪婪模式和非贪婪模式。: g" m! W! J, K* w' O
贪婪模式:尽可能多的去匹配数据,表现为\d后面加某个元字符,例如\d*:
  1. print(re.findall("010-\d*", "010-123456789"))
复制代码
输出:
4 V7 t+ U$ R; b1 O& Q1 [4 N
['010-123456789']
/ L0 m8 T; |. O. \2 F1 C
非贪婪模式:尽可能少的去匹配数据,表现为\d后面加?,例如\d?
  1. print(re.findall("010-\d*?", "010-123456789"))
复制代码
输出为:
8 W' B5 R$ }  t2 `1 P
['010-']
  H& B; [0 N8 \2 S) E. h7 l/ w% @
(10){m,n}" I% j$ x# h1 v4 b# [
m,n指的是十进制数,表示最少重复m次,最多重复n次,例如:
  1. print(re.findall("010-\d{3,5}", "010-123456789"))
复制代码
输出:- |- ?% Y$ |# f- m$ p4 A
['010-12345']3 t* o; p+ w( G% u, q& I9 _, B
加上?表示尽可能少的去匹配
  1. print(re.findall("010-\d{3,5}?", "010-123456789"))
复制代码
输出:
4 T. m' j% d2 q4 g# r2 x' e
['010-123']* f  @4 a' z# H, m) `$ x# B. J
{m,n}还有其他的一些灵活的写法,比如:
7 F. x* J5 P9 L- n5 A+ K7 @( M! t
        2 ~0 X' ^1 ?7 e  L$ l3 S
  • {1,} 相当于前面提过的 + 的效果    + g- g0 f+ y8 v
  • {0,1} 相当于前面提过的 ? 的效果   
    3 r$ {+ |, ~/ y$ L7 B  d* m
  • {0,} 相当于前面提过的 * 的效果& z: u. J6 p4 C/ F

) D1 E4 `3 j; o关于常用的元字符以及使用方法就先到这里,我们再来看看正则的其他知识。# k7 \% L/ ?2 k% M  `; [) v1 s


& _9 b' [" o, |  l0 H" e/ Y4 n(二)正则的使用
5 G' J' i" P6 Y. f5 ^* P" N
6 A4 n7 e# F- ^/ Q5 q4 Y2 [
( X% f  a+ a# r" n; `2 N4 h1.编译正则
; S. T; |% a: d. Y6 ?. {
6 _0 p2 X' ^5 ]/ f0 [8 Z在Python中,re模块可通过compile() 方法来编译正则,re.compile(正则表达式),例如:
  1. s = "010-123456789" rule = "010-\d*" rule_compile = re.compile(rule) #返回一个对象 # print(rule_compile) s_compile = rule_compile.findall(s) print(s_compile)        #打印compile()返回的对象是什么
复制代码
输出结果:
: x5 Q, Q# s" u. O7 R4 ^/ g$ W
['010-123456789']0 x4 e+ G" Y  [% m1 l! K

, v" ?: u" E9 H8 e" V2.正则对象的使用方法
. S& l/ c/ Y( `; h( y  y' g
' E6 Y4 g' r2 i, ~% O! T正则对象的使用方法不仅仅是通过我们前面所介绍的 findall() 来使用,还可以通过其他的方法进行使用,效果是不一样的,这里我做个简单的总结:
7 v' @/ C6 x6 j  z: P- B(1)findall()
$ R- }6 O8 C/ }  G找到re匹配的所有字符串,返回一个列表
8 x! J) m( c6 P5 Y0 A3 F9 y(2)search()5 b0 _# K( k: f3 F0 L- v
扫描字符串,找到这个re匹配的位置(仅仅是第一个查到的)
( _. Q4 t6 k) C) H4 z0 y+ [(3)match()
5 @/ y2 o1 y6 ^/ F) C决定re是否在字符串刚开始的位置(匹配行首)& ?& l9 G  t8 ]# K
就拿上面的 compile()编译正则之后返回的对象来做举例,我们这里不用 findall() ,用 match() 来看一下结果如何:
  1. s = "010-123456789"rule = "010-\d*"rule_compile = re.compile(rule)  # 返回一个对象# print(rule_compile)s_compile = rule_compile.match(s)print(s_compile)  # 打印compile()返回的对象是什么
复制代码
输出:9 f! l% `, |; b8 Q" t

: f+ y! d; ?: U9 E
可以看出结果是1个match 对象,开始下标位置为0~13,match为 010-123456789 。既然返回的是对象,那么接下来我们来讲讲这个match 对象的一些操作方法。2 U  r! p$ R; o* @" A
" x% p( W' U6 Q5 {) C

0 f2 q& n+ s: @  X$ m2 P3.Match object 的操作方法
' d8 I; C% A7 e' ?5 e7 M- ^' I- O! y) M# d6 g5 b! u
这里先介绍一下方法,后面我再举例,Match对象常见的使用方法有以下几个:
8 P% X1 O( U2 }. d(1)group()
/ }5 M8 k. o3 J. n5 Y# r5 x返回re匹配的字符串" d% ?; m+ F% j: ]
(2)start()
- i  a0 {/ x/ c& l7 |& d返回匹配开始的位置1 v# \2 [9 ^: \. F& R2 N
(3)end()
+ `; o9 ~( c2 j6 Y9 G$ g* [返回匹配结束的位置4 r6 a6 U3 [6 I5 I( U
(4)span(): _* G8 p  V/ K
返回一个元组:(开始,结束)的位置  W, F8 u9 Q/ \8 N
举例:用span()来对search()返回的对象进行操作:
  1. s = "010-123456789"rule = "010-\d*"rule_compile = re.compile(rule)  # 返回一个对象s_compile = rule_compile.match(s)print(s_compile.span())  #用span()处理返回的对象
复制代码
结果为:
9 R" V; ?1 Q% X: i5 j
(0, 13)! O3 ~- g8 U' P/ m/ x6 [
6 I" B! N) [0 b+ V2 \, W5 S
4.re模块的函数9 d; [8 l5 ?2 E: p8 w- E+ m5 D& R
% |& ], m# ^" ~" O4 S  f$ }
re模块中除了上面介绍的findall()函数之外,还有其他的函数,来做一个介绍:6 X$ ^: [9 }  U9 X+ D
(1)findall()
. U  \+ l* p, F6 s! w, l根据正则表达式返回匹配到的所有字符串,这个我就不多说了,前面都是在介绍它。
0 n$ C" k: a% ~0 m4 ?6 v8 T(2)sub(正则,新字符串,原字符串)5 Q* d& I( P) b3 g  V1 B6 R
sub() 函数的功能是替换字符串,例如:
  1. s = "abcabcacc" #原字符串l = re.sub("abc","ddd",s)   #通过sub()处理过的字符串print(l)
复制代码
输出:# w) ~8 R! Q3 L
ddddddacc #把abc全部替换成ddd
. @$ Z* v4 Y. W' {$ ^2 }. Y
(3)subn(正则,新字符串,原字符串). T/ w0 d$ }0 d* |3 Z
subn()的作用是替换字符串,并返回替换的次数
  1. s = "abcabcacc" #原字符串l = re.subn("abc","ddd",s)   #通过sub()处理过的字符串print(l)
复制代码
输出:/ [5 x* N0 e# i  _( N, ^
('bbbbbbacc', 2)
/ c* Z+ k% @6 w: G7 ~( f
(4)split()
& _5 l9 J& D/ ~; L; {  ysplit()分割字符串,例如:
  1. s = "abcabcacc"l = re.split("b",s)print(l)
复制代码
输出结果:  a0 P! e- t" z( j4 J( j5 q4 Y0 S0 [/ G
['a', 'ca', 'cacc']
( K" B6 I5 |) O+ f! ]9 i

1 t, E% a. d; Y  P, M关于正则,我就讲这么多了,正则几乎是Python所有方向中是必不可少的一个基础,祝你的Python之旅学有所成!) ]' s* X' T) p
到此这篇关于Python正则表达式保姆式教学详细教程的文章就介绍到这了,更多相关Python正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!; ]4 S( C# E! B2 i; g/ x
7 H, G3 c0 @3 A% P+ s
来源:http://www.jb51.net/article/221286.htm
% e0 a$ c9 B7 ~; ]+ O免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

帖子地址: 

梦想之都-俊月星空 优酷自频道欢迎您 http://i.youku.com/zhaojun917
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2026-10-21 16:36 , Processed in 0.050146 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表