re

依赖re模块

匹配单个字符

.

import re
ret = re.match(".","M")
print(ret.group())

ret = re.match("t.o","too")
print(ret.group())

ret = re.match("t.o","two")
print(ret.group())
>>>
M
too
two

[ ]
import re

# 如果hello的首字符小写,那么正则表达式需要小写的h
ret = re.match("h","hello Python") 
print(ret.group())


# 如果hello的首字符大写,那么正则表达式需要大写的H
ret = re.match("H","Hello Python") 
print(ret.group())

# 大小写h都可以的情况
ret = re.match("[hH]","hello Python")
print(ret.group())
ret = re.match("[hH]","Hello Python")
print(ret.group())
ret = re.match("[hH]ello Python","Hello Python")
print(ret.group())

# 匹配0到9第一种写法
ret = re.match("[0123456789]Hello Python","7Hello Python")
print(ret.group())

# 匹配0到9第二种写法
ret = re.match("[0-9]Hello Python","7Hello Python")
print(ret.group())

#跳过了4

ret = re.match("[0-35-9]Hello Python","7Hello Python")
print(ret.group())

# 下面这个正则不能够匹配到数字4,因此ret为None
ret = re.match("[0-35-9]Hello Python","4Hello Python")
# print(ret.group())


import re

# 普通的匹配方式
ret = re.match("嫦娥1号","嫦娥1号发射成功") 
print(ret.group())


# 使用\d进行匹配
ret = re.match("嫦娥\d号","嫦娥1号发射成功") 
print(ret.group())


import re

match_obj = re.match("\D", "f")
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print("匹配失败")

import re

# 空格属于空白字符
match_obj = re.match("hello\sworld", "hello world")
if match_obj:
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")



# \t 属于空白字符
match_obj = re.match("hello\sworld", "hello\tworld")
if match_obj:
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

import re

match_obj = re.match("hello\Sworld", "hello&world")
if match_obj:
result = match_obj.group()
print(result)
else:
print("匹配失败")



match_obj = re.match("hello\Sworld", "hello$world")
if match_obj:
result = match_obj.group()
print(result)
else:
print("匹配失败")

import re

# 匹配非特殊字符中的一位
match_obj = re.match("\w", "A")
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print("匹配失败")

# 匹配特殊字符中的一位
match_obj = re.match("\W", "&")
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print("匹配失败")



image.png

import re

#  | 	匹配左右任意一个表达式

# 定义列表
my_list = ["苹果", "芒果", "菠萝", "草莓", "香蕉"]

 # 芒果 草莓
for name in my_list:

 # 正则
 match_obj = re.match("芒果|草莓", name)
#判断
if match_obj:
    print("%s是我想要的水果" % match_obj.group())
else:
    print("%s不是我想要的水果" % name)


# (ab) 	将括号中字符作为一个分组
# 邮箱
# 163 126 qq sina
# 因为在正则中.有特殊的函数 代表的是任意字符
# 需求: 只是单纯的代表一个点
# 解决方案" \ (转义字符) .
match_obj = re.match("[a-zA-Z0-9_]{5,20}@(163|126|qq|sina)\.com", "hello@163.com")
print(match_obj.group())


match_obj = re.match("(\w+)(@)(163|126|qq|sina)\.com", "hello@163.com")


print(match_obj.group())         hello@163.com
print(match_obj.group(0))        hello@163.com
print(match_obj.group(1))         hello
print(match_obj.group(2))         @
print(match_obj.group(3))         163

 \num 	引用分组num匹配到的字符串

# 字符串
desc = "<html>hh</html>"

match_obj = re.match("<(\w*)>.*</\\1>", desc)
print(match_obj.group())


</\\1> /表示/html的/
第二个\表示转义字符
第三个\和1配合使用,道标第一组的正则

match_obj = re.match("<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", desc)
if match_obj:
    print(match_obj.group())
else:
     print("匹配失败")

desc = "水果有201个 其中苹果10个"
match_obj = re.search("\d+", desc)
print(match_obj.group())

desc ="水果有20个 其中苹果10个"
match_obj = re.findall('\d+',desc)
print(match_obj)

>>    ['20','10']

desc = "评论数:10 赞数:20"
# result = re.sub("\d+", "666", desc)
# print(result)


# 02: 需求: 10 20 -> (num + 10) * 2
desc = "评论数:10 赞数:20"

def deal_data(match_obj):
     result = int(match_obj.group())
     return str((result + 10) * 2)

result = re.sub("\d+", deal_data, desc)
print(result)

\d进行正则匹配,匹配到的是match_obj对象,
因为匹配到的是字符串,要进行int转换才能进行运算,
最终返回到原始的字符串中需要再次转化为str

desc = "貂蝉,杨玉环:西施-王昭君"
my_list = re.split(",|:|-", desc)
print(my_list)

['貂蝉', '杨玉环', '西施', '王昭君']


compile()与findall()一起使用,返回一个列表。
import re
def main():
    content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
    regex = re.compile('\w*o\w*')
    x = regex.findall(content)
    print(x)


if __name__ == '__main__':
    main()
# ['Hello', 'from', 'Chongqing', 'montain', 'to', 'you']

compile()与match()一起使用,可返回一个class、str、tuple。但是一定需要注意match(),从位置0开始匹配,匹配不到会返回None,
返回None的时候就没有span/group属性了,并且与group使用,返回一个单词‘Hello’后匹配就会结束。


import re
def main():
    content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
    regex = re.compile('\w*o\w*')
    y = regex.match(content)
    print(y)
    print(type(y))
    print(y.group())
    print(y.span())


if __name__ == '__main__':
    main()
# <_sre.SRE_Match object; span=(0, 5), match='Hello'>
# <class '_sre.SRE_Match'>
# Hello
# (0, 5)

#compile()与search()搭配使用, 返回的类型与match()差不多,
但是不同的是search(), 可以不从位置0开始匹配。但是匹配一个单词之后,匹配和match()一样,匹配就会结束。

import re
def main():
    content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
    regex = re.compile('\w*o\w*')
    z = regex.search(content)
    print(z)
    print(type(z))
    print(z.group())
    print(z.span())


if __name__ == '__main__':
    main()
# <_sre.SRE_Match object; span=(0, 5), match='Hello'>
# <class '_sre.SRE_Match'>
# Hello
# (0, 5)

import re

s = "This is a number 234-235-22-423"

match_obj = re.match(".+(\d+-\d+-\d+-\d+)", s)
print(match_obj.group())
# python正则是贪婪 尽可能多的匹配
print(match_obj.group(1))

match_obj = re.match(".+?(\d+-\d+-\d+-\d+)", s)
print(match_obj.group())
print(match_obj.group(1))

# 02:
desc = """<img data-original="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" src="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" style="display: inline;">"""
match_obj = re.search("https?://.*?\.jpg", desc)
if match_obj:
    print(match_obj.group())


import re
m = re.match(r'(.*) are (.*?) dog','fat are cat dog 111')

print('整句话',m.group(0))
整句话 fat are cat dog

print(m.group(1))
fat

print(m.group(2))
cat

print(m.groups())
('fat', 'cat')

import re
m = re.match('www','www.baidu.com')

print('结果对象',m)
结果对象 <_sre.SRE_Match object; span=(0, 3), match='www'>

print('结果',m.group())
结果 www

print('起始与终点',m.span())
起始与终点 (0, 3)

print('匹配的起始位置',m.start())
匹配的起始位置 0

print('终点位置',m.end())
终点位置 3

问题

  1. 报错 nothing to repeat at position
    r = 'asdadsasdasd*'
    re.search(r,str)
    报错

正则有问题, r应该为 '.asdasd.asdasd.*'


中文符号	规则	中文符号	规则
(	\uff08	)	\uff09
〈	\u3008	〉	\u3009
《	\u300a	》	\u300b
「	\u300c	」	\u300d
『	\u300e	』	\u300f
﹃	\ufe43	﹄	\ufe44
〔	\u3014	〕	\u3015
…	\u2026	—	\u2014
~	\uff5e	﹏	\ufe4f
¥	\uffe5	、	\u3001
【	\u3010	】	\u3011
,	\uff0c	。	\u3002
?	\uff1f	!	\uff01
:	\uff1a	;	\uff1b
“	\u201c	”	\u201d
‘	\u2018	’	\u2019

查找两个特殊字符之间的段落

pat = re.conpile('字符1'+'(.*?)'+'字符2',re.S)
res_list = pat.findall(data)  # 获取所有符合正则的段落信息

注意:
如果段落是这样的  
aaa
asdasdasd
aaa
dsfdsfdsfdf
aaa

字符1 和字符2 都用aaa的话,会抵消掉一个,可以在处理直线将aaa变为 aaa\naaa
aaa
gdsffsgfdg
aaa
aaa
gsfdsgs
aaa
aaa
asdasdasd
原文地址:https://www.cnblogs.com/cizao/p/11481750.html