python下的正则使用

正则表达式(python)

正则语法

匹配语法

匹配实例

实例  描述
[Pp]ython        匹配 "Python" 或 "python"
rub[ye]          匹配 "ruby" 或 "rube"
[aeiou]          匹配中括号内的任意一个字母
[0-9]            匹配任何数字。类似于 [0123456789]
[a-z]            匹配任何小写字母
[A-Z]            匹配任何大写字母
[a-zA-Z0-9]      匹配任何字母及数字 
[^aeiou]         除了aeiou字母以外的所有字符类
[^0-9]           匹配除了数字外的字符类
^[0-9]           匹配以数字开头的字符类 
    [0-9]$           匹配结尾为数字的字符类
[0-27-7]         表示0 ,1, 2, 5, 6, 7 几个字符组成的字符类
贪婪 懒惰
# coding=utf-8

import re

# 使用贪婪量词
m = re.search(r'\d{6,8}', '87654321') # 出现数字8次
print(m) # 匹配字符 <_sre.SRE_Match object; span=(0, 9), match='87654321'>


# 使用惰性量词
m = re.search(r'\d{5,8}?', '87654321') # 出现数字5次
print(m) # 匹配字符'87654'
分组
# coding=utf-8

import re

p = r'(\d{3,4})-(\d{7,8})'
m = re.search(p, '010-87654321')
print(m) # <_sre.SRE_Match object; span=(0, 12), match='010-87654321'>

print(m.group())  #返回匹配的字符串      010-87654321
print(m.group(1)) #获得第一个组的内容    010
print(m.group(2)) #获得第二个组的内容    87654321
print(m.groups()) #获得所有组的内容      ('010', '87654321')
命名分组
# coding=utf-8

import re

p = r'(?P<area_code>\d{3,4})-(?P<phone_code>\d{7,8})'
m = re.search(p, '010-87654321')
print(m) # <_sre.SRE_Match object; span=(0, 12), match='010-87654321'>

print(m.group())  #返回匹配的字符串      010-87654321
print(m.group(1)) #获得第一个组的内容    010
print(m.group(2)) #获得第二个组的内容    87654321
print(m.groups()) #获得所有组的内容      ('010', '87654321')

#通过分组名字来访问分组的内容
print(m.group('area_code'))  #          010
print(m.group('phone_code')) #          87654321
反向引用
# coding=utf-8

import re

p = r'<(\w+)>.*</(\w+)>'

m = re.search(p, '<a>abc</a>')
print(m) # <_sre.SRE_Match object; span=(0, 10), match='<a>abc</a>'>

m = re.search(p, '<a>abc</b>')
print(m) # <_sre.SRE_Match object; span=(0, 10), match='<a>abc</b>'>


# 反向引用
p = r'<(\w+)>.*</\1>' # \1 为引用第一组编号

m = re.search(p, '<a>abc</a>')
print(m) # <_sre.SRE_Match object; span=(0, 10), match='<a>abc</a>'>

m = re.search(p, '<a>abc</b>')
print(m) # None
非捕获分组
# coding=utf-8

import re

s = 'img1.jpg, img2.jpg, img3.bmp'

p = r'\w+(\.jpg)'
m = re.findall(p, s)
print(m) # ['.jpg', '.jpg']


#非捕获分组
p = r'\w+(?:\.jpg)'
m = re.findall(p, s)
print(m) #['img1.jpg', 'img2.jpg']
字符串分割
  • split(pattern, string, maxsplit=0, flags=0)
# coding=utf-8

import re

p = r'\d+'
text = 'as34d5ff55r'

c_list = re.split(p, text)
print(c_list) #['as', 'd', 'ff', 'r']

c_list = re.split(p, text, maxsplit=1) #分割一次
print(c_list) #['as', 'd5ff55r']

c_list = re.split(p, text, maxsplit=2) #分割两次
print(c_list) #['as', 'd', 'ff55r']
字符串替换
  • re.sub(pattern, repl, string, count=0, flags=0) 替换字符串中的匹配项
# coding=utf-8

import re

p = r'\d+'
text = 'as34d5ff55r'

c_list = re.sub(p, '', text)
print(c_list) # 'asdffr'

c_list = re.sub(p, '', text, count=1) #替换一次
print(c_list) # 'asd5ff55r'

c_list = re.sub(p, '', text, count=2) #替换两次
print(c_list) # 'asdff55r' 
re.match re.search 的用法
  • re.search(pattern, string, flags=0) 扫描整个字符串并返回第一个成功的匹配
  • re.match(pattern, string, flags=0) 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
import re

print(re.match(r'www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.match(r'com', 'www.runoob.com'))         # 不在起始位置匹配

line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
print("matchObj.group()  : ", matchObj.group())
print("matchObj.group(1) : ", matchObj.group(1))
print("matchObj.group(2) : ", matchObj.group(2))

### 输出 ###
# (0, 3)
# None
# matchObj.group() :  Cats are smarter than dogs
# matchObj.group(1) :  Cats
# matchObj.group(2) :  smarter
re.findall的用法
  • re.findall(self, path, namespaces=None) 以列表形式返回全部能匹配的子串
import re

p = re.compile(r'\d+')
print (p.findall('one1two2three3four4'))

### output ###
# ['1', '2', '3', '4']
re.finditer的用法
  • re.finditer(self, string, pos=0, endpos=-1) 返回一个顺序访问每一个匹配结果(Match对象)的迭代器
import re

p = re.compile(r'\d+')
for m in p.finditer('one1two2three3four4'):
    print(m.group())

### output ###
# 1
# 2
# 3
# 4
将正则表达式编译成pattern对象
  • re.compile(pattern, flags=0)
import re

# 将正则表达式编译成Pattern对象
pattern = re.compile(r'hello')

# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match('hello world!')

if match:
    # 使用Match获得分组信息
    print match.group()

### 输出 ###
# hello

编译标志

  • re.ASCII 或 re.A 设置采用ASCII编码
  • re.UNICODE 或 re.U 设置采用UNICODE编码
  • re.IGNORECASE 或 re.I 忽略大小写
  • re.DOTALL 或 re.S 使用(.)元字符匹配换行符
  • re.MULTILINE 或 re.M 多行模式
  • re.VERBOSE 或 re.X 详细模式 可以在正则表达式中添加注释, 可以有空格和换行 便于阅读
修饰符
修饰符 描述
re.I    使匹配对大小写不敏感
re.L    做本地化识别(locale-aware)匹配
re.M    多行匹配,影响 ^ 和 $
re.S    使 . 匹配包括换行在内的所有字符
re.U    根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X    该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值