您的位置:首页 > 编程语言 > Python开发

python基础-正则表达式、python使用正则

2017-11-13 15:36 519 查看
正则表达式
字符组

元字符

量词

字符集

转义符

贪婪匹配

python中的正则使用

匹配标签

正则表达式

在学习python中如何使用正则表达式,我们先来了解下正则表达式

正则表达式本身也和python没有什么关系,就是匹配字符串内容的一种规则。

官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

推荐一个在线正则

在线测试工具 http://tool.chinaz.com/regex/

字符组

字符组 : [字符组]

正则待匹配字符结果说明
[0123456789]8True在一个字符组里枚举合法的所有字符,字符组里的任意一个字符和”待匹配字符”相同都视为可以匹配
[0-9]7True也可以用-表示范围,[0-9]就和[0123456789]是一个意思
[a-z]sTrue同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
[A-Z]BTrue[A-Z]就表示所有的大写字母
[0-9a-fA-F]eTrue可以匹配数字,大小写形式的a~f,用来验证十六进制字符

元字符

. 匹配除换行符以外的任意字符

\w 匹配字母或数字或下划线

\s 匹配任意的空白符

\d 匹配数字

\n 匹配一个换行符

\t 匹配一个制表符

\b 匹配一个单词的结尾

^ 匹配字符串的开始

$ 匹配字符串的结尾

\W 匹配非字母或数字或下划线

\D 匹配非数字

\S 匹配非空白符

a|b 匹配字符a或字符b

() 匹配括号内的表达式,也表示一个组

[…] 匹配字符组中的字符

[^…] 匹配除了字符组中字符的所有字符

正则待匹配字符结果说明
海.海燕海娇海东海燕海娇海东匹配所有”海.”的字符
^海.海燕海娇海东海燕只从开头匹配”海.”
海.$海燕海娇海东海东只匹配结尾的”海.$”

量词:

* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复n次

{n,} 重复n次或更多次

{n,m} 重复n到m次



字符集[][^]



*转义符 *



贪婪匹配



python中的正则使用

import re

# 返回所有满足匹配条件的结果,放在列表里
ret = re.findall('a', 'eva egon yuan')
print(ret) #结果 : ['a', 'a']

#search从左到右依次找,找到一个就回来,需要使用group()获取返回值
#如果re.search找不到,就返回None。使用group会报错
ret = re.search('a', 'eva egon yuan')
if ret:
print(ret.group())

# match从头开始匹配,匹配上了需要使用group来获取返回值
# 匹配不上返回None,使用group会报错
# 同search,不过尽在字符串开始处进行匹配
ret = re.match('a', 'abc').group()
print(ret)
#结果 : 'a'

# 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
ret = re.split('[ab]', 'abcd')
print(ret)  # ['', '', 'cd']

#将数字替换成'H',参数1表示只替换1个
ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)
print(ret) #evaHegon4yuan4

#将数字替换成'H',返回元组(替换的结果,替换了多少次)
ret = re.subn('\d', 'H', 'eva3egon4yuan4')
print(ret)

# 将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
obj = re.compile('\d{3}')
#正则表达式对象调用search,参数为待匹配的字符串
ret = obj.search('abc123eeee')
print(ret.group())  #结果 : 123

import re

# finditer返回一个存放匹配结果的迭代器
ret = re.finditer('\d', 'ds3sy4784a')
print(ret)  # <callable_iterator object at 0x10195f940>
print(next(ret).group())  #查看第一个结果
print(next(ret).group())  #查看第二个结果
print([i.group() for i in ret])  #查看剩余的左右结果


输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/1.复习.py
['a', 'a']
a
a
['', '', 'cd']
evaHegon4yuan4
('evaHegonHyuanH', 3)
123
<callable_iterator object at 0x035A1E50>
3
4
['7', '8', '4']

Process finished with exit code 0


匹配标签

还可以在分组中利用?的形式给分组起名字

获取的匹配结果可以直接用group(‘名字’)拿到对应的值

如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致

获取的匹配结果可以直接用group(序号)拿到对应的值

ret = re.search("<\w+>\w+</\w+>","<h1>hello</h1>")
if ret:
print(ret.group())

ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
print(ret.group('tag_name'))  #结果 :h1
print(ret.group())  #结果 :<h1>hello</h1>
#分组的命名和组的引用

ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
print(ret.group(1))
# 如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
# 获取的匹配结果可以直接用group(序号)拿到对应的值
print(ret.group())  #结果 :<h1>hello</h1>
ret = re.findall(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
print(ret)


输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/2.正则复习.py
<h1>hello</h1>
h1
<h1>hello</h1>
h1
<h1>hello</h1>
['h1']

Process finished with exit code 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: