详解python之re库使用方法2

参考资料

[1] Python之正则表达式细讲 2023.2;
[2] Python之re库用法细讲 2023.3;
[3]
一、使用 re 模块的前期准备工作
二、使用 re 模块匹配字符串

  1. 使用 match() 方法进行匹配
  2. 使用 search() 方法进行匹配
  3. 使用 findall() 方法进行匹配
    三、使用 re 模块替换字符串
    四、使用 re 模块分割字符串

前言

Python语言专门提供了 re 模块,用于实现正则表达式的操作。我们使用较多的场景是,使用 re 模块提供的方法(如 search()、match()、findall()等)进行字符串处理,也可以先使用 re 模块的 compile() 方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串,接下来就跟大家介绍一下 re 模块的详细用法。

二、使用 re 模块匹配字符串

re 模块中提供了 match()、search() 和 findall() 等方法专门用来匹配字符串,可以从海量数据中精确筛选出需要的对象,我们逐一来看看每种方法的具体实现。

  1. 使用 match() 方法进行匹配
      match() 方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回 Match 对象,否则返回 None。其语法格式如下:
re.match(pattern, string, [flags])

0. re 子函数

re 模块中提供了 match()search()findall() 等方法专门用来匹配字符串,可以从海量数据中精确筛选出需要的对象。
在这里插入图片描述

1. re.split()

1.实例演示

实例 1

import re
s = 'abc,  abc,  defg,  dds'
re.split('\W+', s)  # 说明:\W 匹配任何非单词字符,任何字母

# 运行结果:
['abc', 'abc', 'defg', 'dds']

实例 2

import re
s = 'abc,  abc,  defg,  dds'
re.split('(\W+)', s)  # 说明:如果加上括号或'[]',结果会同时返回去掉的值

# 运行结果:
['abc', ',  ', 'abc', ',  ', 'defg', ',  ', 'dds']

实例 3

import re
s = 'abc,  abc,  defg,  dds'
re.split('(\W+)', s, 1)  # 说明:当前字符串只切分1次

运行结果:
['abc', ',  ', 'abc,  defg,  dds']

实例 4

import re
s = 'abc,  abc,  defg,  dds'
re.split('wxy*', s)  # 说明:没有可匹配的项,返回原来的字符串。

运行结果:
['abc,  abc,  defg,  dds']

实例 5

import re
line = 'aaa bbb ccc;ddd   eee,fff'
re.split(r'[;,]',line)  # 两个字符以上切割需要放在 [ ] 中

运行结果:
['aaa bbb ccc', 'ddd   eee', 'fff']

实例 6

import re
line = 'aaa bbb ccc;ddd   eee,fff'
re.split(r'[;,\s]',line)  # 所有空白字符切割

运行结果:
['aaa', 'bbb', 'ccc', 'ddd', '', '', 'eee', 'fff']

实例 7

import re

file_name = 'F:\\02-data\\data_standar\\0224整年-Exported.csv'
print(re.split('[\\\, .]', file_name))

['F:', '02-data', 'data_standar', '0224整年-Exported', 'csv']

实例8

>>> re.split(r'\W+', 'Words, words, words.')
# ['Words', 'words', 'words', '']
>>> re.split(r'(\W+)', 'Words, words, words.')
# ['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split(r'\W+', 'Words, words, words.', 1)
# ['Words', 'words, words.']
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
# ['0', '3', '9']
>>> re.split(r'(\W+)', '...words, words...')
# ['', '...', 'words', ', ', 'words', '...', '']
>>> re.split(r'\b', 'Words, words, words.')
# ['', 'Words', ', ', 'words', ', ', 'words', '.']

实例9

>>> re.split(r'\W*', '...words...')
# ['', '', 'w', 'o', 'r', 'd', 's', '', '']
>>> re.split(r'(\W*)', '...words...')
# ['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', '']
str(re.split('[-.]', 'filter_Molas_(2019-11-15_2020-03-28)_高层研究-山东泰山队.csv'))
Out[4]: "['filter_Molas_(2019', '11', '15_2020', '03', '28)_高层研究', '山东泰山队', 'csv']"
str(re.split('[-.]', 'filter_Molas_(2019-11-15_2020-03-28)_高层研究-山东泰山队.csv')[-2])
Out[5]: '山东泰山队'

实例10

案例:用split()函数分割一个字符串并转换成列表


import re
s = "abcabcacc"
l = re.split("b", s)
print('运行结果为:', l)

#运行结果为:['a', 'ca', 'cacc']
re.split('\\\\', files[0]) 
Out[12]: 
['E:',
 '02-data',
 '02-profile',
 '152-csv格式文件',
 'filter-Exported.csv']
re.split('\\\\', files[0]) [-1]
Out[13]: 'filter-Exported.csv'
files[0]
Out[14]: 'E:\\02-data\\02-wind_profile\\152-csv格式文件\\filter-Exported.csv'

2. re.search() 和 re.match()对比

对id这一列,提取前面的数字部分

b = data.loc[:, 'id'].apply(lambda x: re.search('\d+', x).group())

语法

re.search(pattern, string, flags=0)

>>> re.match("c", "abcdef")    # No match
>>> re.search("c", "abcdef")   # Match
<re.Match object; span=(2, 3), match='c'>
>>> re.match("c", "abcdef")    # No match
>>> re.search("^c", "abcdef")  # No match
>>> re.search("^a", "abcdef")  # Match
<re.Match object; span=(0, 1), match='a'>
>>> re.match('X', 'A\nB\nX', re.MULTILINE)  # No match
>>> re.search('^X', 'A\nB\nX', re.MULTILINE)  # Match
<re.Match object; span=(4, 5), match='X'>

3.re.search()

>>> m = re.search(r'(?<=-)\w+', 'spam-egg')  # r'(?<=-)\w+',表示识别'<=-'这几个符号后边的单词或者数字,是'egg'
>>> m.group(0)
'egg'
>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
ids_list = data.loc[:, 'id'].apply(lambda x: re.search('\d+', x).group())

x列元素为’‘00005’,‘‘00228’,……,‘‘00263’,带一个单引号,匹配后的结果为’00005’,‘00228’,……,‘00263’

4.re.findall()

>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
#r'\bfoo\b' matches 'foo', 'foo.', '(foo)', 'bar foo baz' but not 'foobar' or 'foo3'
>>> re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
[('width', '20'), ('height', '10')]

在这里插入图片描述

5.re.escape()

>>> print(re.escape('https://www.python.org'))
https://www\.python\.org

>>> legal_chars = string.ascii_lowercase + string.digits + "!#$%&'*+-.^_`|~:"
>>> print('[%s]+' % re.escape(legal_chars))
[abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&'\*\+\-\.\^_`\|\~:]+

>>> operators = ['+', '-', '*', '/', '**']
>>> print('|'.join(map(re.escape, sorted(operators, reverse=True))))
/|\-|\+|\*\*|\*

6. 正则表达式的简单说明

正则表达式,由普通字符和元字符组成
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8. re.compile

在这里插入图片描述

# 使用正则表达式来切分句子,切分的规则是除单词,数字外的任意字符串
regEx = re.compile(r'[-_\s]')  
p1 = regEx.split(s1.lower())

# [\u4e00-\u9fa5]中文范围,在PyCharm中,将中文或单词拆为1个1个的字母或汉字
res = re.compile(r"([\u4e00-\u9fa5]+)")  

re.match() 方法进行匹配

参考链接:

[1] python 中re.split()的用法 2019.9
[2] 百科:python正则表达式
[3] Python 中re.split()方法 2019.9
[4] Python正则表达式 ;
[5] re — Regular expression operations¶ ;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值