一、正则表达式
. :匹配任意一个字符
^ :匹配以什么开头的字符,如果放在中括号中表示取反,如 ^abc 表示匹配以 abc 开头的字符,[^abc] 表示匹配 abc 之外的字符
$ :匹配以什么结尾的字符
* :匹配零个或多个星号前面的字符,如 abc* 可以匹配 ab 、abc 、abcc 、abccc 等等
+ :匹配一个或多个加号前面的字符,如 abc+ 可以匹配 abc 、abcc 、abccc 等等
? :匹配零个或一个问号前面的字符,如 abc? 只能匹配 ab 、abc
\ :用于转义,比如我要匹配 $ 这个字符,但是 $ 用于匹配以什么结尾的字符,因此我就可以用 \$ 来匹配 $ 这个字符
| :表示'或者',比如 ab|cd 可以匹配 'ab' 或 'cd'
{} :匹配指定个花括号前面的字符,如 ab{2} 可以匹配 abb ,也可以是一个范围,如 ab{1,4} 可以匹配 ab 、abb 、abbb 、abbbb
[] :匹配中括号中的任意一个字符,如 [0-9] 表示匹配 0~9 中的任意一个数字
() :如果用括号括起来表示一个整体,如 (ab){2} 把 ab 当成一个整体,只能匹配 abab ,另外还有(?P<name>....) 的形式,我们
知道用括号括起来的表示一个整体,比如 (abcdefg) 是一个整体,但如果括号里面的内容很长很长,那么我们访问这个整体的时候
是通过给这个整体取个别名的方式,即 (?P<name>....) 的方式,如 (?P<a>(abcdefg)) 表示把 (abcdefg) 这个整体取个别名 a ,
当我们访问的时候访问 a 就相当于访问 (abcdefg) ,在正则中这通常称为分组
\d :匹配任何数字,相当于 [0-9]
\D :匹配非数字字符,相当于 [^0-9]
\s :匹配任何空白字符,如空格、Tab制表符、换行符等
\S :匹配任何非空白字符
\w :匹配所有的字母和数字,相当于 [a-zA-Z0-9]
\W :匹配所有的非字母和数字,相当于[^a-zA-Z0-9]
二、re 模块
re.findall() :用于从一个字符串中匹配指定的字符
In [18]: import re
In [32]: re.findall(r'ab', 'abcdabcd') # 表示从字符串'abcdabcd'中匹配包含'ab'字符,结果以列表的形式返回
Out[32]: ['ab', 'ab'] # r'ab'中的r表示原生字符,即引号里面是什么就匹配什么,比如r'\n'表示匹配'\n'这个字符串而不是匹配换行符
In [19]: re.findall(r'^ab', 'abcdefg') # 表示从字符串'abcdefg'中匹配以'ab'开头的字符,结果以列表的形式返回
Out[19]: ['ab']
In [52]: re.findall(r'ab', 'abcdABcd', re.I) # re.I 是一个标记,表示匹配的时候不区分大小写
Out[52]: ['ab', 'AB']
In [54]: re.findall(r'foo$', 'foo\nfoo\nfoo', re.M) # re.M 用于对每一行进行匹配,如果不加的话只会打印一个'foo',也就是忽略了'\n'的换行作用
Out[54]: ['foo', 'foo', 'foo']
re.match() :用法与 re.findall() 一致,但只匹配开头的位置,且 re.match() 返回的是一个对象,需要用 group() 方法来查看所匹配到的内容
In [32]: re.findall(r'ab', 'abcdabcd') # findall()可以匹配到所有指定的字符
Out[32]: ['ab', 'ab']
In [34]: m = re.match('ab', 'abcdabcd') # match()只能匹配开头的字符
In [35]: m.group()
Out[35]: 'ab'
re.search() :用法与 re.findall() 一致,但 re.findall() 会匹配所有包含的字符,而 re.search() 只匹配一个包含的字符
In [42]: re.findall(r'ab', 'abcdabcd')
Out[42]: ['ab', 'ab']
In [43]: m = re.search(r'ab', 'abcdabcd')
In [44]: m.group() # 同理用group()方法查看
Out[44]: 'ab'
re.sub() :用于替换字符串
In [45]: re.sub(r'ab', 'AB', 'abcdabcd') # 表示将字符串'abcdabcd'中的'ab'都替换成'AB'
Out[45]: 'ABcdABcd'
In [46]: re.sub(r'ab', 'AB', 'abcdabcd', count=1) # count=1 可以指定只替换一次
Out[46]: 'ABcdabcd'
re.compile() :用于将正则表达式编译成对象,并用它们来进行匹配
In [48]: p = re.compile(r'ab') # 先将要匹配的内容(即正则表达式)进行编译
In [49]: p.findall('abcdabcd') # 这里就可以直接匹配,提高效率
Out[49]: ['ab', 'ab']
In [50]: p.search('abcdabcd').group()
Out[50]: 'ab'
In [51]: p.match('abcdabcd').group()
Out[51]: 'ab'
re.split() :可以使用正则来分割指定的字符串
In [30]: re.split(r'\d', 'one1two2three3four')
Out[30]: ['one', 'two', 'three', 'four']
re.finditer() :用法与 re.findall() 一致,但 re.findall() 返回的是一个列表,re.finditer() 返回的是一个对象,就好比 print 与 return 的区别
In [42]: re.findall(r'ab', 'abcdabcd')
Out[42]: ['ab', 'ab']
In [43]: re.finditer(r'ab', 'abcdabcd')
Out[43]: <callable-iterator at 0x29cf650>
In [44]: for i in re.finditer(r'ab', 'abcdabcd'):
....: print(i.group())
....:
ab
ab