亭台六七座,八九十枝花——python正则表达

本文介绍了Python中的正则表达式,包括正则表达式的概念、语法、常见正则表达字符以及匹配分组的使用。详细讲解了re模块的方法,如`compile`, `findall`, `match`等,并举例说明各种正则字符的功能,如`d`, `s`, `w`等。还探讨了如何进行匹配分组和引用分组。" 95931762,8658845,数据可视化Catalogue:解读与使用指南,"['数据可视化', 'R语言', '图形库', '数据科学', '统计图形']
摘要由CSDN通过智能技术生成
山村咏怀
[宋]邵雍
一去二三里,烟村四五家。
亭台六七座,八九十枝花。

1 正则表达

正则表达是一种字符串的查询和匹配规则,按照提供的规则完成目标字符串中的数据的查询和检索,是一种独立的技术,不是某种编程语言独有

2 语法

python中正则表达使用python的内建re模块

部分方法:

  • ‘A’, ‘ASCII’, 选项:字符串匹配过程中,使用ascii码操作
  • ‘I’, ‘IGNORECASE’,选项:字符串匹配过程中,忽略大小写
  • ‘M’, ‘MULTILINE’, 选项:字符串匹配过程中,多行匹配
  • ‘S’, ‘Scanner’, 选项:使 . 匹配包括换行在内的所有字符
  • ‘compile’, 方法-编译正则表达式,得到正则表达式对象,使用较少
  • ‘findall’, 方法-从目标字符串中,查询所有符合规则的字符串,返回一个列表
  • ‘finditer’, 方法-从目标字符串中,查询所有符合规则的字符串,返回一个生成器
  • ‘match’, 方法-从目标字符串的第一个字符开始匹配,返回第一个匹配的结果
  • ‘search’, 方法-从目标字符串所有的位置匹配,返回第一个匹配的结果
  • ‘split’, 方法-按照正则表达式规则拆分字符串
import re

msg = """一去二三里,烟村四五家。亭台六七座,八九十枝花。
Within one stretch of two or three miles,Visible: 
four or five hamlets in mist-veils;Dotted with pavilions, 
six or seven,Twigs of flowers, how many? Eight, nine, ten."""

# 1、 查询or字符串(忽略大小写)出现的次数  # 注意数字符串不是单词
# 在目标字符串msg中,查询符合vp规则的字符串,查询时忽略大小写
vp = r"or"  # r是原生字符串(禁止转义),是python的语法
res = re.findall(vp, msg, re.I)
print(res)  # ['or', 'or', 'or']

# 2、查询msg中,以s(忽略大小写)开头的7个字符以内的字符串  # 注意数字符串不是单词
vp2 = r"s\w{1,6}"
res2 = re.findall(vp2, msg, re.I)
print(res2)  # ['stretch', 'sible', 'st', 'six', 'seven']

# 3、正则表达式findall()得到的是一个列表,较消耗内存,使用finditer()得到迭代器
vp3 = r"m\w{1,8}"
res3 = re.findall(vp3, msg, re.I)  # ['miles', 'mlets', 'mist', 'many']
print(res3)
res4 = re.finditer(vp3, msg, re.I)
print(res4)  # <callable_iterator object at 0x0000022F47DCB708>
for x in res4:
    print(x.group())  # 不使用group打印出来的是对象

# 4、 search和match
vp4 = "with"
res41 = re.match(vp4, msg, re.I)  # 匹配目标字符串的开头第一个字符,返回一个对象
res42 = re.search(vp4, msg, re.I)  # 匹配目标字符串中的任意位置的字符,返回第一个位置对象
print(res41)  # None
print(res42)  # with

3 常见正则表达字符

a 匹配字符a

\d 匹配0~9的一个数字
\D 匹配不是0~9的任意一个字符
\s 匹配一个空白字符,包含空格和tab
\S 匹配一个非空白字符
\w 匹配任意一个 大写字母/小写字母/0~9数字/下划线(在python3中,中文字符包含在单词字符中,python2不包含)
\W 匹配任意一个不是\w的字符,如特殊符号
\b 匹配一个单词的边界
\B 匹配不是单词的开头或结束位置

^ 匹配目标字符串的开头位置,用在字符串中,如果用在[]中表示取反 例:^acb
$ 匹配目标字符串的结束位置 例:10$
. 匹配任意一个字符,匹配任意一个字符,除了\n(换行符)

[] 匹配[]中列举的字符
[0-9] 匹配一个0~9的数字,等价于\d
[0-3] 匹配一个0~3 的数字
[0-12] 匹配一个0~1的数字,或者2
[125] 匹配一个数字,1或者2或者5(不用加逗号)
[a-z] 匹配一个小写字母
[A-Z] 匹配一个大写字母
[a-zA-Z] 匹配一个大写/小写字母
[A-Za-z0-9_] 等价于\w

a? 匹配字符a出现了0次或者1次
a+ 匹配字符a出现了1次或者多次
a* 匹配字符a出现了0次或者多次
a{m,n} 匹配字符a最少出现了m次,最多出现n次,中间不要有空格
a{m,} 匹配字符a最少出现m次
a{,n} 匹配字符a最多出现n次

(hello) 匹配hello,在匹配结果中将结果分组展示

4 匹配分组

匹配分组有以下几种方式:

  • 表达式|表达式|表达式|······ 任意表达式成立皆可
  • (表达式) 匹配表达式,在匹配结果中将结果分组展示
  • \分组序号 引用分组匹配到的字符串
  • (?P<name>表达式) 给分组起别名
  • (?P=name) 引用别名为name的分组匹配到的的字符串
import re
msg = """一去二三里,烟村四五家。亭台六七座,八九十枝花。
Within one stretch of two or three miles,Visible:
four or five hamlets in mist-veils;Dotted with pavilions,
six or seven,Twigs of flowers, how many? Eight, nine, ten."""


# 表达式|表达式|表达式|······ 任意表达式成立皆可
res = re.findall(r"with.{1,10}|[一二三四五]{1,5}", msg, re.I)  # 匹配with开始和后面的1-10个字符串 或 []内列举的连续1-5个字符串
print(res)  # ['一', '二三', '四五', 'Within one str', 'with pavilions']


# (表达式) 匹配表达式,在匹配结果中将结果分组展示
msg2 = "亭台六七座,八九十枝花。"
res2 = re.match(r"(一.*|亭.*),(烟.*|八.*)", msg2)  # 匹配相应指定字符串开头的句子,”,“前后各为一组
if res2:
    # group(0)或group()获取默认组(所有匹配组,完整结果)
    print(res2.group(0))  # 亭台六七座,八九十枝花。
    # 获取第一组匹配结果
    print(res2.group(1))  # 亭台六七座
    # 获取第二组匹配结果
    print(res2.group(2))  # 八九十枝花。
else:
    print("匹配不到内容")


msg3 = "亭台六七座,八九十枝花。<亭台六七座,八九十枝花。>"

# (?P<name>表达式) 给分组起别名
# (?P=name)  引用别名为name的分组匹配到的的字符串
res3 = re.match(r"(?P<first>亭.*?。)(<(?P=first)>)", msg3)  # 匹配从“亭”到“。“的字符且是最小匹配(懒惰模式)
print(res3.group())  # 亭台六七座,八九十枝花。<亭台六七座,八九十枝花。>
print(res3.group(1))  # 亭台六七座,八九十枝花。
print(res3.group(2))  # <亭台六七座,八九十枝花。>

# \num 引用分组:引用分组匹配到的字符串
res4 = re.match(r"(亭.*?。)(<(\1)>)", msg3)  # 引用第一个分组的表达式
print(res4.group())  # 亭台六七座,八九十枝花。<亭台六七座,八九十枝花。>
print(res4.group(1))  # 亭台六七座,八九十枝花。
print(res4.group(2))  # <亭台六七座,八九十枝花。>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值