正则表达式(Regular Expression)是文本处理极为重要的技术,用它可以对字符串按照某种规则进行检索,替换。
元字符:
. : 表示匹配单个字符
[abc] : 字符集合,只能表示一个字符位置,匹配所包含的任意一个字符。
[a-z] : 字符集合,只能表示一个字符位置,匹配所包含的任意一个字符。其他常用列如[A-Z][0-9]
[^abc] : 表示匹配除去集合内字符的任意一个字符。
\d :等同于[0-9], 表示匹配一位数字
\D : 等同于[^0-9], 表示匹配一位非数字
\w : 匹配[a-zA-Z0-9_],包括中文的字。
\W : 匹配\w之外的字符。
\s : 匹配一位空白字符,包括换行符,制表符,空格等。[\r\f\n\t\v]
\S : 匹配一位非空白字符。
\ : 转义字符 如上基本符号匹配都需要转义字符 如 \* 表示匹配*号
^ : 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)
$ : 表示匹配字符串的结束位置
重复匹配:
来看一些实例:
1、非负整数:^\d+$
2、正整数:^[0-9]*[1-9][0-9]*$
3、非正整数:^((-\d+)|(0+))$
4、负整数:^-[0-9]*[1-9][0-9]*$
5、英文字符串:^[A-Za-z]+$
6、英文大写串:^[A-Z]+$
7、英文小写串:^[a-z]+$
8、英文字符数字串:^[A-Za-z0-9]+$
9、匹配11位手机号码:^\d{11}$ (简单匹配,未做判断)
10、匹配中国座机(列如025-83105736):^\d{3,4}-\d{7,8}$ ( (简单匹配,未做判断))
python 使用re模块提供了正则表达式处理的能力
re模块常用方法:
编译:
compile()
编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
re.compile(pattern,flags=0)
pattern: 编译时用的表达式字符串。
单次匹配:
match()
决定RE是否在字符串刚开始的位置匹配。//注:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'
re.match(pattern, string, flags=0)
import re
p = re.compile(r'\d') #匹配模式为1个数字
print(p.match('a1b2c3'))
print(p.match('1abc'))
--------------------------------------------------
执行结果:
None
<_sre.SRE_Match object; span=(0, 1), match='1'>
search()
re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
re.search(pattern, string, flags=0)
import re
p = re.compile(r'\d') #匹配模式为1个数字
print(p.search('df1e2fd3'))
print(p.search('dsfewer'))
--------------------------------------------------
执行结果:
<_sre.SRE_Match object; span=(2, 3), match='1'>
None
fullmatch()
re.fullmatch函数是将整个字符串与正则表达式匹配,如果匹配上就返回字符串,否则返回None。
re.fullmatch(pattern,string.flags=0)
import re
p = re.compile(r'\d*') #匹配模式为任意个数字,包括0个。
print(p.fullmatch('3123'))
print(p.fullmatch('243wr'))
--------------------------------
执行结果:
<_sre.SRE_Match object; span=(0, 4), match='3123'>
None
全文搜索:
findall()
re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
re.findall(pattern, string, flags=0)
import re
p = re.compile(r'\d+')
print(p.findall('o1n2m3k4'))
--------------------------------------
执行结果:
['1', '2', '3', '4']
finditer()
搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。
re.finditer(pattern, string, flags=0)
import re
p = re.compile(r'\d+')
ret = p.finditer('o1n2m3k4')
print(ret)
print(next(ret))
print(next(ret))
-------------------------------
执行结果:
<_sre.SRE_Match object; span=(1, 2), match='1'>
<_sre.SRE_Match object; span=(3, 4), match='2'>
分割字符串:
split()
按照能够匹配的子串将string分割后返回列表。
re.split(pattern, string[, maxsplit])
import re
#将字符串用\W(不是英文字母,数字和_)字符组成的字符串切割
print(re.split('\W*',"os.path.commonprefix(['/usr/lib', '/usr/local/lib"))
-----------------------------------------------
执行结果:
['os', 'path', 'commonprefix', 'usr', 'lib', 'usr', 'local', 'lib']