Python 正则表达式学习(二)正则表达式语法

来源:互联网 发布:兼职翻译 知乎 编辑:程序博客网 时间:2024/04/29 05:51


一,单一字符匹配:

(1)匹配任意字符: .    

import reres = re.match(r'a..','abcd')print(res.group())#打印结果:abc
一点.表示匹配任意的字符。上面的代码表示匹配a后面的任意两个字符。必须从a开始。若写成 b.. 则会发生错误。



(2)匹配指定字符:[  ]

如   [ 0-9a-zA-Z ]   表示 匹配一个 0~9或所有英文字母

import reres = re.match(r'[0-9a-zA-Z]',r'abc')print(res.group())#打印结果:a


(3)\d 和 \D:匹配数字和匹配非数字

import reres = re.match(r'\d',r'123abc')print(res.group())#打印结果:1


(4)\s 和 \S :匹配空白字符和非空白字符(就是空格)


(5)\w 和 \W:匹配 0~9,a~z,A~Z的字符 和 非 0~9,a~z,A~Z的字符 

跟[ 0-9a-zA-Z ]作用相同


(6)\b 和 \B

\b的作用是匹配一个单词边界,即是单词和空间之间的位置

例如: er\b 可以匹配 never 中的 er ,但不能匹配 verb 中的 er

二,一次匹配多个字符

(1) *  匹配前一个字符0~无限次

import reres = re.match('1*', r'112233abcd')print(res.group())#打印结果:11
上面的代码由于 *的前面是1,所以可以匹配无限个1(其实只有2兆多个)

import reres = re.match(r'\w*', r'112233abcd')print(res.group())#打印结果:112233abcd
上面的代码则打印全部的字符串


(2)+ 匹配前一个字符 1~无限次

+ 与 * 的区别就是 + 不允许没有匹配到字符,而 * 可以不匹配到字符

import reres = re.match(r'1+', r'112233abcd')print(res.group())#打印结果:11
若:

import reres = re.match(r'0+', r'112233abcd')print(res.group())#打印结果:程序报错,因为字符串里没有0 


(3)?匹配前一个字符 0次或者1次

import reres = re.match(r'1?', r'1112233abcd')print(res.group())#打印结果:1


(4){m} 和 {n,m}  匹配前一个字符m次 和 匹配前一个字符至少n次至多m次

import reres = re.match(r'1{1,3}', r'111112233abcd')print(res.group())#打印结果:111


三,字符串边界匹配

(1)^ 和 $ 在字符串中

^用在字符串中表示匹配时,^后的第一个字符必须在字符串的第一个位置,而$则规定$前面的内容必须在字符串的最后才能匹配成功,如:

import re#匹配电子邮箱res = re.match(r'\w{3,10}@163.com$',r'zje@163.commm')print(res.group())#打印结果:程序出现错误,因为$表示所在位置必须是字符串的结尾res = re.match(r'\w{3,10}@163.com$',r'zje@163.com')print(res.group())#打印结果:zje@163.com  

(2)\A 和 \Z

作用和 ^ 和 $ 一样。



四,分组匹配

(1) |

A|B 的作用是匹配 A 或 B,如:

import re#匹配电子邮箱res = re.match(r'\w+@(163|126|qq)\.com',r'zje@126.com')print(res.group())#打印结果:zje@126.com  #这样写不仅可以匹配126的邮箱,还能匹配163和qq邮箱。

(2)分组(ab):作用是()中的ab被视为一个分组

import re#匹配电子邮箱reg = r'<(dir>)\w+</\1'str = r'<dir>test_zje</dir>'res = re.match(reg,str)print(res.group())#打印结果:<dir>test_zje</dir>#上面的代码 括号()括起了 dir>  表示 dir> 为第一个分组,所以后面的\1 就表示第一个分组 dir> 

当然也可以给分组起一个名字,用名字来引用分组,如:

import re#匹配电子邮箱reg = r'<(?P<mark>[\w]+>).+</(?P=mark)'str = r'<dir>test_zje</dir>'res = re.match(reg,str)print(res.group())#打印结果:<dir>test_zje</dir>#上面的代码 把第一个分组命名为 mark,然后(?P=mark)表示引用一个命名为mark的分组


(3)向前向后查找

只有在组内才能向前向后查找

如在字符串 src="http://www.xxxxxxx.jpg" 中的 http://www.xxxxxxx.jpg

正则可以这样写: reg = r' ((?<=src=")http://www.xxxxxxx.1.jpg(?=") ) '

前面的(?<=src=)表示若字符串中有 “src=” 这个字符串则匹配,但不返回 “src=“ 这个字符串,用在正则表达式之前

后面的(?=")表示若字符串中有 双引号“ 则匹配,但不返回 双引号” ,用在正则表达式之后。

0 0