正则表达式

 

元字符与转义

正则表达式的元字符包括: ^ $ . [ ] { } - ? * + ( ) | \

元字符有着特殊的意义,当需要取消元字符的特殊含义时,需要在元字符之前加上反斜线字符 \

^$ 在正则表达式中被当作锚,其中 ^ 匹配字符串的起始位置,$ 匹配字符串的结束位置。

任意字符

. 匹配除 \n 之外的任意字符。

否定

如果中括号内的第一个字符是 ^,表示匹配不在指定字符集内的字符。

字符范围

- 字符连接的两个字符表示范围,例如 [0-9] 等价于 [0123456789]。需要注意的是:- 左边字符的码值要小于右边字符的码值。

或选项

regex1 | regex2 表示匹配 regex1 或 regex2。

实例

a) 判断字符串 str 是否以数字开头

>>> re.search(r"^[\d][\s\S]*", str) != None;

b) 判断字符串 str 是否以小写字母结尾

>>> re.search(r"[\s\S]*[a-z]$", str) != None;

c) 匹配由空格隔开的字符串

>>> re.findall(r"[^ ]+", "long time no see");
['long', 'time', 'no', 'see']

 

字符类简记法

\d 等价于 [0-9],其中的 d 表示数字(digital)
\D 等价于 [^\d]

\w 等价于 [0-9a-zA-Z],其中的 w 表示单词字符(word)
\W 等价于 [^\w]

\s 等价于 [ \t\r\n\v\f],其中的 s 表示空白字符(space)
\S 等价于 [^\s]

实例

a) 匹配字符串中的数字

>>> re.findall(r"[\d]+", "abc123def456");
['123', '456']

b) 使用 [\s\S] 或 [\d\D]、[\w\W] 匹配任意字符,包括 \n

>>> re.search("^[\s\S]+$", "!@#$%^&*()12345qwert") != None
True

 

POSIX 字符类

POSIX 字符类 描述 ASCII 字符类 
 [:alnum:]  字母字符与数字字符  [0-9A-Za-z]
 [:blank:]  空格符与制表符   [ \t]
 [:cntrl:]  控制字符  [\x00-\x1F\x7F]
 [:digit:]  数字字符  [0-9]
 [:graph:]  可见字符  [\x21-\x7E]
 [:lower:]  小写字母字符  [a-z]
 [:print:]  可打印字符,包括 [:graph:] 中所有字符再加上空格符  [\x20-\x7E]
 [:punct:]  标点符号字符  
 [:space:]  空白字符  [ \t\r\n\v\f]
 [:upper:]  大写字母字符  [A-Z]
 [:word:]  字母字符  [0-9A-Za-z_]
 [:xdigit:]  十六进制字符  [0-9A-Fa-f]

需要注意的是,有些语言不支持 POSIX 字符类,比如 Python、JavaScript 。Java 中,POSIX 字符类 [[:name:]] 必须使用 \p{Name} 的形式,比如 [:space:] 当写作 \p{Space},注意第一字母要大写,除了 [:xdigit:] 要写作 \p{XDigit}。

 

量词

量词 含义
{n}  前面的元素恰好出现 n 次则匹配
{m,n}  前面的元素出现的次数在 n~m 次之间时则匹配 
{m,}  前面的元素出现次数超过 n 次则匹配
{,n}  前面的元素出现次数不超过 m 次则匹配
*  等价于 {0,}
+  等价于 {1,}
?  等价于 {0,1}

 

贪婪匹配与惰性匹配

实例

a) 贪婪匹配

>>> re.findall(r"<span>[\s\S]*</span>", "<div><span>abc</span><br><span>xyz</span></div>");
['<span>abc</span><br><span>xyz</span>']

a) 惰性匹配

>>> re.findall(r"<span>[\s\S]*?</span>", "<div><span>abc</span><br><span>xyz</span></div>");
['<span>abc</span>', '<span>xyz</span>']

 

posted on 2015-12-24 20:17  huey2672  阅读(311)  评论(0编辑  收藏  举报