Python-----正则表达式

Python 正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re 模块使 Python 语言拥有全部的正则表达式功能。

  • 正则需要用到re 模块 ,使用import re 进行调用
    • match;只从头进行匹配,匹配到就返回结果对象,没有找到就返回None。
    • search: 从任意位置匹配,匹配就返回结果对象,都是单次匹配(找到就停止不在查找)。
    • findall:全部匹配,返回所有匹配到结果的列表,没有找到返回空列表。
    • compile:创建正则表达式,可以让创建的正则对象和内容匹配分开操作
import re
r=re.match('abc', 'abchadajabcadjlae')# 在起始位置匹配
print(r.group())#返回匹配到的内容
print(r.span())#返回匹配内容的位置,结果为一个元组,(开始位置,结束位置)
#结果:abc
     (0, 3)
     
m= re.match('abc', 'hadajabccadjlae')# 不在起始位置匹配
print(r)
#结果:None

s= re.search('abc', 'hadajabccadjlae')
print(s.group())
print(s.span())
#结果:abc
	  (5, 8)
	  
f = re.findall('cba','ahkjdcbasdkjalcbasakldjacba')
print(f)
#结果;['cba', 'cba', 'cba']

以上可以使用compile生成一个正则表达式对象,功函数使用如:

c=re.compile('cba')
f = c.findall('ahkjdcbasdkjalcbasakldjacba')
print(f)
#结果;['cba', 'cba', 'cba']

正则表达式语法

单个字符的匹配:

  • []:中间的任意一个字符
    [abc]:abc的任意一个字符
    [0-9]:任意的数字字符
    [a-zA-Z]:任意的字母
    [^0-9]:匹配非数字字符(除了数字之外字符)
    [^…]:不在[]中的字符
  • . :除’\n’以外的任意字符
  • \d:数字字符,等价于[0-9]
  • \D:非数字字符,等价于[^0-9]
  • \w:匹配字(数字、字母、下划线)汉字也包括
  • \W:匹配非字(\w相反的内容)
  • \s:空白字符(\n、\r、\t、空格)
  • \S:非空白字符(\s相反的内容)
  • \b:词边界(开头、结尾、空格、标点)
c=re.findall('\w','n3\\\!@#h你哈')
print(c)
#输出结果:['n', '3', 'h', '你', '哈'

c=re.findall('\d','sd2dsd4eds18d5d')
print(c)
#输出结果:['2', '4', '1', '8', '5']


次数限定;用于修饰前面单个字符出现的次数

  • *:出现任意次
  • +:至少一次
  • ?:至多一次 (出现一次或没有)
  • {m}:指定出现次
  • {m,n}:m<=次数<=n
  • {m,}:至少m次
  • {,m}:至多m次
a=re.findall('\d+','sd2dsd4eds18d5d')
print(a)
#输出结果:['2', '4', '18', '5']
a=re.findall('\d{2,3}','sd2d4ed18d235dsd3467d12')
print(a)
#输出结果:['18', '235', '346', '12']

a=re.findall('\d{2,}','sd2d4ed18d235dsd3467d12')
print(a)
#输出结果:['18', '235', '3467', '12']

边界限定

  • ^:以指定的内容开头
  • $:以指定内容结尾
a=re.findall('^hello', 'asjdhelloaskd')
print(a)
#输出结果:[]
f = re.findall('world$', 'asjdhelloaskworld')
print(f)
#输出结果:['world']
  • 分组匹配
c=re.compile('(\d+)([a-z]+)(\d+)')
s=c.search('hddh23hxhjja45hhj')
if s:
     # 0:表示完整匹配内容,之后的数字表示第几组,也就是第几个()匹配的内容
    print(s.group(0), s.span(0))#结果为 23hxhjja45   (4, 14)
    print(s.group(1), s.span(1))#结果为 23  (4, 6)	
    print(s.group(2), s.span(2))#结果为 hxhjja  (6, 12)
    print(s.group(3), s.span(3))#结果为 45  (12, 14)
    
#findall:按照正则进行匹配,但是添加()后,结果只显示()匹配的内容
a=re.findall('w(ab)sd','qwabsde')
print(a)#结果为 ['ab']
  • 正则切割
# 字符串是固定切割,不能解决某类的匹配切割问题
# 按照正则进行切割
string = '正则其实不难1但是学完之后2发现什么也不出来3是这样吧'
c = re.compile(r'\d')#根据数字切割
ret=c.split(sting)
print(ret)
#结果:['正则其实不难', '但是学完之后', '发现什么也不出来', '是这样吧']
#整体方案
print(re.split(r'\d',string))
  • 正则替换
s = 'how1are2you'
s2 = re.sub(r'\d', '+', s)
print(s2)

#结果;how+are+you

# 替换时可以传递一个函数,使用函数的返回值进行替换
def double(s): #参数是根据正则匹配得出的结果
    return str(int(s.group()) * 2)
# 使用专门的处理函数,可以认为的干预替换过程
s2 = re.sub(r'\d', double, s)
print(s2) 

#结果:how2are4you

你可能感兴趣的:(python,正则,正则匹配,正则切割,正则替换)