Python正则表达式

  • [abc]匹配abc字符。会去文本中找对应的字符,并返回。
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]匹配az之间的任意一个字符,[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)

re模块

  • 上面我们用的都是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<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})\d{3}([\d|X])', text) 
for item in data_list:
    print(item.groupdict()) # {'year': '1990', 'month': '03', 'day': '07'}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值