[abc]
匹配a
或b
或c
字符。会去文本中找对应的字符,并返回。import re
text = '你好a, b, abc, asdff,'
data_list = re.findall('[abc]', text)
print(data_list) # ['a', 'b', 'a', 'b', 'c', 'a']
还可以与其他字符进行组合:
import re
text = '你好a, b, abc, 好asdff,'
data_list = re.findall('好[abc]', text)
print(data_list) # ['好a', '好a']
[^abc]
匹配除了a、b、c以外的字符。import re
text = '你好a, b, abc, 好asdff,'
data_list = re.findall('[^abc]', text)
print(data_list) # ['你', '好', ',', ' ', ',', ' ', ',', ' ', '好', 's', 'd', 'f', 'f', ',']
[a-z]
匹配a
到z
之间的任意一个字符,[0-9]
也可以import re
text = 'trouble trend tank'
data_list = re.findall('t[a-z]', text)
print(data_list) # ['tr', 'tr', 'ta']
.
代指除换行符以外任意一个字符import re
text = 'The Raiden Shogun is a playable Electro character in Genshin Impact.'
data_list = re.findall('R.iden', text) # 其中的 ‘.’ 只能代指一个字符
print(data_list) # ['Raiden']
import re
text = 'The Raiden Shogun is a playable Electro character in Genshin Impact.'
# 贪婪匹配
data_list = re.findall('p.+a', text) # 其中的 ‘.+’ 中的‘+’表示‘.’代指的字符可以是一个或多个
print(data_list) # ['playable Electro character in Genshin Impa']
# 非贪婪匹配
data_list = re.findall('p.+?a', text)
print(data_list) # ['pla']
\w
匹配字母、数字、下划线或者汉字import re
text = 'The Raiden Shogun (雷电将军) is a playable Electro character in Genshin Impact.'
data_list = re.findall('雷电\w+', text)
print(data_list) # ['雷电将军']
\d
匹配数字import re
text = 'log4j is a java jar'
data_list = re.findall('log\d', text)
print(data_list) # ['log4']
\s
表示任意空白字符import re
text = 'root admin add root'
data_list = re.findall('a\w+\s', text)
print(data_list) # ['admin ', 'add ']
*
表示前一个字符出现0次或多次import re
text = 'root admin add admin'
data_list = re.findall('ad*', text)
print(data_list) # ['ad', 'add', 'ad']
+
表示前一个字符出现1次或多次import re
text = 'abcccddddazzzz'
data_list = re.findall('ab*', text)
print(data_list) # ['ab', 'a']
?
表示前面的字符出现0次或者1次import re
text = '9527就是唐伯虎'
data_list = re.findall('\d?就是', text)
print(data_list) # ['7就是']
{n}
表示前面的字符出现n次import re
text = '手机号码是13801239876'
data_list = re.findall('138\d{4}', text)
print(data_list) # ['1380123']
{n,}
表示前面的字符出现n次或者大于n次import re
text = '手机号码是13801239876'
data_list = re.findall('138\d{4,}', text) # 匹配138后面大于等于4位的数字
print(data_list) # ['13801239876']
{n,m}
重复次数是从n次到m次import re
text = '手机号码是13801239876'
data_list = re.findall('138\d{4,5}', text)
print(data_list) # ['13801239']
上面都是按照整体去匹配,如何匹配部分数据呢,这里可以使用分组的概念:
import re
text = '金庸武侠小说中的人物有李秋水, 李沧海, 李莫愁, 段誉, 李三'
data_list = re.findall('李\w{1,2}', text) # 全部提取出来
print(data_list) # ['李秋水', '李沧海', '李莫愁', '李三']
data_list = re.findall('李(\w{1,2})', text) # 通过括号, 进行分组, 只提取出名
print(data_list) # ['秋水', '沧海', '莫愁', '三']
# 如果有多个括号进行分组
data_list = re.findall('(李)(\w{1,2})', text) # 多个括号, 进行分组, 将会得到一个元组
print(data_list) # [('李', '秋水'), ('李', '沧海'), ('李', '莫愁'), ('李', '三')]
# 括号可以包含
data_list = re.findall('(李(\w{1,2}))', text)
print(data_list) # [('李秋水', '秋水'), ('李沧海', '沧海'), ('李莫愁', '莫愁'), ('李三', '三')]
# 分组可以或运算
text = '唐伯虎进了华府, 变成了华安, 9527却不喜欢唐伯虎'
data_list = re.findall('(华\w{1,2}|\d+)', text)
print(data_list) # ['华府', '华安', '9527']
text = '110101199003073116'
data_list = re.findall('(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9|X])', text)
print(data_list) # [('110101', '1990', '03', '07', '311', '6')]
re.ASCII
可以将中文排除import re
text = '我的QQ邮箱是175638@qq.com谢谢'
data_list = re.findall('\w+@\w+\.\w+', text) # ['我的QQ邮箱是175638@qq.com谢谢']
data_list = re.findall('\w+@\w+\.\w+', text, re.ASCII) # ['175638@qq.com']
print(data_list)
findall
函数,用来获取匹配到的所有数据match
,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None。这个方法主要用于判断一些用户输入的数据格式。import re
text = '嘿嘿, 9527就是唐伯虎, 唐伯虎就是9527'
data = re.match('\d+就是', text)
print(data) # None, 因为字符串一开始并不是数字开头
text = '9527就是唐伯虎, 唐伯虎就是9527'
data = re.match('\d+就是', text)
if data:
content = data.group() # 如果匹配成功
print(content) # 9527就是
search
,不需要从起始位置匹配,只要文本中能匹配成功,就返回一个对象,未匹配成功返回None。import re
text = '嘿嘿, 9527就是唐伯虎, 唐伯虎就是9527'
data = re.search('\d+就是', text)
if data:
content = data.group()
print(content) # 9527就是
sub
,替换匹配成功的位置import re
text = '嘿嘿, 9527就是唐伯虎, 唐伯虎就是9527'
data = re.sub('\d+', '华安', text)
print(data) # 嘿嘿, 华安就是唐伯虎, 唐伯虎就是华安
# 只替换1个
data = re.sub('\d+', '华安', text, 1)
print(data)# 嘿嘿, 华安就是唐伯虎, 唐伯虎就是9527
split
,根据匹配位置进行分割import re
text = '嘿嘿, 9527就是唐伯虎, 唐伯虎就是9527'
data = re.split('\d+', text)
print(data) # ['嘿嘿, ', '就是唐伯虎, 唐伯虎就是', '']
# 当然也可以指定匹配的个数
data = re.split('\d+', text, 1)
print(data) # ['嘿嘿, ', '就是唐伯虎, 唐伯虎就是9527']
finditer
,与findall
不同的是,finditer
返回的是一个迭代器,当匹配到的数据量很大时,这个方法可以节省内存。import re
text = '嘿嘿, 9527就是唐伯虎, 唐伯虎就是9527'
data = re.finditer('\d+', text)
for item in data:
print(item.group()) # 9527\n9527
此外finditer
也可以对分组进行命名。通过?P<命名>
来指定。
import re
text = '110101199003073116'
data_list = re.finditer('\d{6}(?P\d{4})(?P\d{2})(?P\d{2})\d{3}([\d|X])' , text)
for item in data_list:
print(item.groupdict()) # {'year': '1990', 'month': '03', 'day': '07'}