Python正则表达式入门:元字符与核心方法详解
本文系统讲解Python中正则表达式(Regular Expression)的基础用法。内容涵盖re模块中findall、search、match、split、sub等核心函数的功能与参数,详细解析元字符如点号、星号、加号、问号、方括号及圆括号的具体作用与贪婪/非贪婪匹配差异,帮助读者掌握文本处理与爬虫数据提取的关键技能。
本文深入解析Python中正则表达式功能的实现与应用。
前文:
首先,我们需要明确什么是正则表达式(Regular Expression)?
例如,若要判断字符串"adi_e32fv,Ls"中是否包含子串"e32f",或者在一个包含百万条姓名的txt文件中筛选出姓氏为“王”且名字以“五”结尾的记录并打印,结果可能包括:“王五”、“王小五”、“王大五”、“王小小五”等。
以往我们依赖字符串函数进行查找,代码实现往往较为繁琐。如今借助正则表达式,仅需一行代码 re.findall('王.*?五',txt1) 即可完成!正则表达式是编写网络爬虫的基础知识,常用于从HTML中抓取符合特定字符串要求的网址。以下是对正则表达式基础知识的个人总结。
(操作环境:32位Win8系统,运行工具:python2.7.9+Eclipse.)
正文:
1、首先需要导入Python的re模块。
2、掌握元字符:. ^ $ * + ? {} [] \ | ()
re模块中的findall(str1,str2)方法用于返回字符串str2中符合str1格式的所有子串。例如在字符串'dit dot det,dct dit dot'中匹配'dit',结果为:
str1 = 'dit dot det,dct dit dot'
print re.findall('dit',str1)
结果:
['dit', 'dit']
|符号的作用:'dit|dct'表示匹配'dit'或者'dct'。
str1 = 'dit dot det,dct dit dot'
print re.findall('dit|dct',str1)
结果:
['dit', 'dct', 'dit']
[]符号的作用:[ic]表示字符'i'或'c',例如'd[ic]t'表示匹配'dit'和'dct',这与'dit|dct'的效果等价:
str1 = 'dit dot det,dct dit dot'
print re.findall('d[ic]t',str1)
结果:
['dit', 'dct', 'dit']
^符号作用一:在[^ic]中,^表示否定,即匹配除了'i'和'c'以外的字符:
str1 = 'dit dot det,dct dit dot'
print re.findall('d[^ic]t',str1)
结果:
['dot', 'det', 'dot']
^符号作用二:^dit表示子串'dit'必须位于字符串开头,而'dct'不在开头:
str1 = 'dit dot det,dct dit dot'
print re.findall('^dit',str1)
print re.findall('^dct',str1)
结果:
['dit'][]
$符号的作用:dot$表示子串'dot'必须位于字符串末尾,而'dct'不在末尾:
str1 = 'dit dot det,dct dit dot'
print re.findall('dot$',str1)
print re.findall('dct$',str1)
结果:
['dot'][]
.符号的作用:d.t表示'd'与't'之间省略了一个任意字符:
str1 = 'dit dot det,dct dit dot'
print re.findall('d.t',str1)
结果:
['dit', 'dot', 'det', 'dct', 'dit', 'dot']
+符号的作用:di+t表示'd'与't'之间省略了一个或多个'i':
str1 = 'd dt dit diit det'
print re.findall('d.+t',str1)
结果:
['dit', 'diit']
*符号的作用:di*t表示'd'与't'之间省略了零个或多个'i':
str1 = 'd dt dit diit det'
print re.findall('d.*t',str1)
结果:
['dt', 'dit', 'diit']
通常,'.'与'+'或'*'搭配使用。'.+'表示省略了一个至多个任意元素,'.*'表示省略了零个至多个任意元素:
str1 = 'd dt dit diit det'
print re.findall('d.+t',str1)
print re.findall('d.*t',str1)
结果:
['d dt dit diit det']['d dt dit diit det']
?符号作用一:观察.+的匹配结果,'dit'、'dot'也满足'd.+t'的匹配条件,但输出的是满足匹配条件的最长子串'dit dot det,dct dit dot',这称为贪婪匹配。若要输出最短的匹配字串,只需在'+'后面加上'?':(注:对于'*'也是一样的,只需在'*'后面加上'?')
str1 = 'd dt dit diit det'
print re.findall('d.+?t',str1)
结果:
['dit', 'dot', 'det', 'dct', 'dit', 'dot']
?符号作用二:di?t表示'i'可有可无,即'dt'、'dit'都满足匹配条件:
str1 = 'd dt dit diit det'
print re.findall('di?t',str1)
结果:
['dt', 'dit']
{}符号作用一:di{n}t表示'd'和't'之间有n个'i':
str1 = 'dt dit diit diiit diiiit'
print re.findall('di{2}t',str1)
结果:
['diit']
{}符号作用二:di{n,m}t表示'd'和't'之间有n到m个'i':
str1 = 'dt dit diit diiit diiiit'
print re.findall('di{1,3}t',str1)
结果:
['dit', 'diit', 'diiit']
其中,n和m都是可以省略的。{n,}表示n个到任意个;{,m}表示0个到m个;{,}表示任意个,功能和'*'一样:
str1 = 'dt dit diit diiit diiiit'
print re.findall('di{1,}t',str1)
print re.findall('di{,3}t',str1)
print re.findall('di{,}t',str1)
结果:
['dit', 'diit', 'diiit', 'diiiit'] ['dt', 'dit', 'diit', 'diiit'] ['dt', 'dit', 'diit', 'diiit', 'diiiit']
\\符号作用一:取消元字符的特殊含义,使其变成转义字符:
str1 = '^abc ^abc'
print re.findall('^abc',str1)
print re.findall('\^abc',str1)
结果:
[]['^abc', '^abc']
\\符号作用二:预定义字符
str1 = '12 abc 345 efgh'
print re.findall('\d+',str1)
print re.findall('\w+',str1)
结果:
['12', '345'] ['12', 'abc', '345', 'efgh']
()符号的作用:在匹配字符串后,只输出匹配字串'()'里面的内容:
str1 = '12abcd34'
print re.findall('12abcd34',str1)
print re.findall('1(2a)bcd34',str1)
print re.findall('1(2a)bc(d3)4',str1)
结果:
['12abcd34']
['2a']
[('2a', 'd3')]
3、re模块里的主要方法:findall()、finditer()、match()、search()、compile()、split()、sub()、subn()。
re.findall(pattern,string,flags = 0)
作用:在string中从左往右搜索与pattern匹配的字串,结果以list形式返回。
str1 = 'ab cd'
print re.findall('\w+',str1)
结果:['ab', 'cd']
re.finditer(pattern,string,flags = 0)
作用:其功能与re.findall相同,但结果以迭代器的形式返回。
str1 = 'ab cd'
iter1 = re.finditer('\w+',str1)
for a in iter1:
print a.group(),a.span()
结果:
ab (0, 2) cd (3, 5)
(注:a.group()返回满足匹配调节的字串,a.span()返回字串的起始位置和末尾位置)
re.search(pattern,string,flags = 0)
作用:在string中从左往右搜索与pattern匹配的字串,无匹配结果则返回None,否则返回一个search实例。
str1 = 'ab cd'
result = re.search('cd',str1)
if result == None:
print 'None'
else:
print result.group(),result.start(),result.end()
结果:cd 3 5
re.match(pattern,string,flags = 0)
作用:判断string的头部是否与pattern匹配,是则返回match实例,否则返回None。
str1 = 'ab cd'
result = re.match('cd',str1)
if result == None:
print 'None'
else:
print result.group(),result.start(),result.end()
结果:None
re.compile(pattern,flags = 0)
作用:对匹配格式pattern进行编译,返回一个实例对象。对正则表达式先编译,可以大幅提高匹配速度。
str1 = 'ab cd'
pre = re.compile('ab')
print pre.findall(str1)
结果:['ab']
re.split(pattern,string,maxsplit = 0,flags = 0)
作用:在string匹配pattern的时候做分割:
str1 = 'ab.c.de'
str2 = '12+34-56*78/90'
print re.split('\.',str1)
print re.split('[\+\-\*/]',str2)
结果:
['ab', 'c', 'de'] ['12', '34', '56', '78', '90']
re.sub(pattern,repl,string,count = 0,flags = 0)
作用:在string当中把满足pattern正则的字串替换成repl:
str1 = 'abcde'
print re.sub('bc','123',str1)
结果:a123de
re.subn(pattern,repl,string,count = 0,flags = 0)
作用:其功能与re.sub()相同,但返回的结果多了一个数字,代表替换了多少次
str1 = 'abcdebce'
print re.subn('bc','123',str1)
结果:('a123de123e', 2)
PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
JavaScript正则表达式在线测试工具: http://tools.jb51.net/regex/javascript
正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg
更多关于Python相关内容可查看本站专题:《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









