首页 > 技术文章 > python中的正则表达式

shuai1993 2018-08-07 21:30 原文

一.转义符 "\""

  正则中的转义:

  1. '\(' :表示匹配小括号

  2.[ () + * ? / $ .]: 在字符组中的一些特殊的字符会出现原形  注意:除了'^'

  3.所有的 \w \d \s(\n,\t, ) \W \D \S都表示它原本的意义

  4.[-]只有写在字符组的首位的时候表示普通的减号

   写在其他的位置是表示范围[1-9]

   如果要匹配减号[1\-9]

  python中的转义:

  1.'\' 表示转义, '\n'表示给这个'n'赋予了特殊意义

  2.print('\\n')  结果为:\n  此时的\表示取消转义

  3.python中 r'\\n'表示取消转义

二.re模块

  1.findall , search, match

findall: 会优先显示()中的内容,要想取消分组优先,(?:正则表达式)

#findall的用法
import
re ret = re.findall('\d+','19874ashfk01248') #参数 返回值类型:列表 返回值个数:1 返回值内容:所有匹配上的项 print(ret) ret1 = re.findall('\s+','19874ashfk01248') #没有匹配到,返回空列表 print(ret1) 结果: ['19874', '01248'] []

优先显示():
ret = re.findall('www.baidu.com|www.oldboy.com','www.oldboy.com')
print(ret)
ret = re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(ret)
ret = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
print(ret)

结果:

['www.oldboy.com']
['oldboy']
['www.oldboy.com']



search : 如果search中有分组的话,通过group(n)就能够拿到group中的匹配的内容

import re
ret2 = re.search('\d+','@$19874ashfk01248')
print(ret2)#  返回值类型: 正则匹配结果的对象  返回值个数:1 如果匹配上了就返回对象
if ret2:
print(ret2.group())  # 返回的对象通过group来获取匹配到的第一个结果

结果:
<_sre.SRE_Match object; span=(2, 7), match='19874'>
19874
ret3 = re.search('\s+','19874ashfk01248')
print(ret3) #  返回值类型: None   如果没有匹配上就是None

分组遇见search:
ret = re.search('\d+(.\d+)(.\d+)(.\d+)?','1.2.3.4-2*(60+(-40.35/5)-(-4*3))')
print(ret.group())
print(ret.group(0))# 0表示空和上面一样
print(ret.group(1))
print(ret.group(2))
print(ret.group(3))

 

match : 同search用法一样,不过仅在字符串开始处匹配

import re
ret4 = re.match('\d+','19874ashfk01248')
print(ret4.group())
ret5 = re.match('\d+','%^19874ashfk01248')
print(ret5)
结果:
19874
None

2.sub , subn , split

sub: 同replace一样,可以设置替换的次数

import re
ret = re.sub('\d+','H','replace789nbc2xcz392zx')
print(ret)
ret1 = re.sub('\d+','H','replace789nbc2xcz392zx,48495',1)
print(ret1)
结果:
replaceHnbcHxczHzx
replaceHnbc2xcz392zx,48495

subn: 返回一个元祖,并返回替换了多少次

import re
ret = re.subn('\d+','H','replace789nbc2xcz392zx')
print(ret)
结果:
('replaceHnbcHxczHzx', 3)

split: 匹配部分加()可以保留匹配项

import re
ret = re.split('\d+','alex83egon20taibai40')
print(ret)
ret = re.split('(\d+)','alex83egon20taibai40')
print(ret)
结果:
['alex', 'egon', 'taibai', '']
['alex', '83', 'egon', '20', 'taibai', '40', '']

3. compile finditer

complie: 编译,将正则表达式编译成为一个 正则表达式对象

    节省时间 : 只有在多次使用某一个相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率

import re
ret = re.compile('-0\.\d+|-[1-9]\d+(\.\d+)?')
res = ret.search('alex83egon-20taibai-40')
print(res.group())
结果:

-20

finditer: 节省空间

import re
ret = re.finditer('\d','sjkhkdy982ufejwsh02yu93jfpwcmc')
for r in ret:
    print(r.group())
结果:
9
8
2
0
2
9
3

三.分组命名

(?P<name>正则表达式)    :给分组起名字

(?P=name)  表示使用这个分组,这里匹配到的内容应该和分

import re
ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>")
print(ret.group('name'))  #结果 :h1
print(ret.group())  #结果 :<h1>hello</h1>

ret = re.search(r'<(?P<tag>\w+)>(?P<c>\w+)</(\w+)>',r'<a>wahaha</b>')
print(ret.group())
print(ret.group('tag'))
print(ret.group('c'))
结果:
h1
<h1>hello</h1>

通过索引使用分组:

   \1 表示使用第一组,匹配到的内容必须和第一个组中的内容完全相同

 

import re
ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")  '\1'指的是第一组,也就是h1
print(ret.group(1))
print(ret.group()) 
 #结果 :
h1
<h1>hello</h1>

 

推荐阅读