2 a W: _% N5 G3 t【注5】:\w 匹配任何字符。如果正则表达式以字节的形式表示,这相当于字符类 [a-zA-Z0-9_];如果正则表达式是一个字符串,\w 会匹配所有 Unicode 数据库(unicodedata 模块提供)中标记为字母的字符。你可以在编译正则表达式的时候,通过提供 re.ASCII 表示进一步限制 \w 的定义。 + t% K {, L' ?, i1 ~, {/ ^" G3 e2 [" G
3. 部分元字符应用详解 4 q7 J: T/ T, P9 A* [/ @2 N4 l. g
^ - r1 S! c' H3 ^ O2 v# e' [ k 6 r. \( ~! a! Y6 s; Q匹配字符串的起始位置。如果设置了 MULTILINE 标志,就会变成匹配每一行的起始位置。在 MULTILINE 中,每当遇到换行符就会立刻进行匹配。 / Q0 g) q* j" h6 x( t; {1 A. T% v) |" y# R' F4 y2 X
举个例子,如果你只希望匹配位于字符串开头的单词 From,那么你的正则表达式可以写为 ^From:; f- `7 C) A7 p0 m5 B, v
8 i4 W5 t& o& H; U' \ d( kprint(re.search('^From', 'From Here to Eternity')) ! G6 h+ f* Z: I- S( K+ R. P2 E- E
print(re.search('^From', 'Reciting From Memory')) # J) o8 a% |& d# D5 y6 ], `1( f; q* _+ h, c, n: e3 X0 H
2* k7 w* w! w5 T. o' k5 J# ^" ]
结果如图: ) v5 n0 P# B6 _7 ^ q8 ]; V9 e8 G: R. e: X1 Z& |
3 y9 C6 `5 a. I$ ~
$ # l3 I4 G" Z: e% f# T" E' c1 s1 d M3 j6 g
匹配字符串的结束位置,每当遇到换行符也会离开进行匹配。 , V0 Z Q; _9 l+ H% a2 K6 V u4 D5 b$ _% Y
print(re.search('}$', '{block}')) ) S5 ~7 p; `6 j4 C . O% V5 b5 D! c9 u4 v& p, v: g% y" G# hprint(re.search('}$', '{block} '))/ M& x, c( U8 `, o! w4 \7 h
; L' R' N: B& A/ p
print(re.search('}$', '{block}\n')) % H c! s- _1 @' s" U. A- ]1 N
18 Q: x0 ], O0 N8 E: f/ o
2 7 @$ b' D2 q, W, K/ a3 ( `8 z8 F5 f& r& e0 C5 A4 + O" d8 J' A. D3 @- @2 h1 i& l/ ^50 f$ P# \1 k( }; U* `+ \. s
结果如图:0 ^+ p ?8 U9 v) N
K" x- w+ o" _/ L& L/ G" ]- g. p( v; O 2 P' H7 ^4 x7 F- m$ p6 W& a. j$ E / Q1 W1 [* R/ M! a' w) m" ]同样,我们使用 $ 来匹配 $字符本身;或者包含在一个字符类中,像这样 [$]。4 X1 K9 C4 t5 k7 Y
! Y3 R: J% k% Q; @/ V' a9 z, p
\A : r; a; O/ H+ f z2 _: h8 K$ I" J4 Z3 y7 e( t
只匹配字符串的起始位置。如果没有设置 MULTILINE 标志的时候,\A 和 ^ 的功能是一样的;但如果设置了 MULTILINE 标志,则会有一些不同:\A 还是匹配字符串的起始位置,但 ^ 会对字符串中的每一行都进行匹配。7 [% q/ r5 L/ ~9 V
/ b3 B3 b) m' [1 s! P\b 8 V9 d2 u, I3 q S) w' S ; W' I4 E2 L D0 z: m单词边界,这是一个只匹配单词的开始和结尾的零宽断言。“单词”定义为一个字母数字的序列,所以单词的结束指的是空格或者非字母数字的字符。5 w( B/ \! q& [2 |8 R- R: |5 M
' ?2 u; H U" v7 `零宽断言相关信息请点击零宽断言查看。: e9 |2 f4 [. X( q! i
% O. n0 `3 s( p. ^1 m
下边例子中,class 只有在出现一个完整的单词 class 时才匹配;如果出现在别的单词中,并不会匹配。8 t# ^$ d5 `9 {. \4 X7 u5 d3 U
0 E I) G1 z; o$ p
p = re.compile(r'\bclass\b'); q, c6 R, [2 v- K6 a
print(p.search('no class at all')) * l7 y- K/ N4 Z- h$ z; w& } T
9 f! h: j$ D0 `8 G( z# p+ d1 D5 w. `print(p.search('the declassified algorithm')) 8 G( \1 G% z: h- k" i+ m+ Q0 ^, U" }/ Q4 `4 G/ E3 c0 D6 K X9 {
print(p.search('one subclass is'))/ b8 n- p$ [) f7 [
13 V1 V) C8 M. ~1 V0 J" x! B
2 ( C4 u3 H+ ^% b6 D4 G. W3 . T1 C. q: X7 f4% `( E$ C D6 u* I: O
5( {5 @4 ^$ \& W( y a
6 $ t: D$ L& C& Y* f7 ~" u" y结果如图:+ |4 `8 L+ D6 \: u1 @
0 N$ t, g6 b8 J0 d" U; l
在使用这些特殊的序列的时候,有两点是需要注意的:# z# P3 w% S- _# h6 Z. N" Y, R