目录
- 参考资料
- 前言
- 二、使用 re 模块匹配字符串
- 0. re 子函数
- 1. re.split()
- 1.实例演示
- 2. re.search() 和 re.match()对比
- 3.re.search()
- 4.re.findall()
- 5.re.escape()
- 6. 正则表达式的简单说明
- 8. re.compile
- re.match() 方法进行匹配
- 参考链接:
参考资料
[1] Python之正则表达式细讲 2023.2;
[2] Python之re库用法细讲 2023.3;
[3]
一、使用 re 模块的前期准备工作
二、使用 re 模块匹配字符串
- 使用 match() 方法进行匹配
- 使用 search() 方法进行匹配
- 使用 findall() 方法进行匹配
三、使用 re 模块替换字符串
四、使用 re 模块分割字符串
前言
Python语言专门提供了 re 模块,用于实现正则表达式的操作。我们使用较多的场景是,使用 re 模块提供的方法(如 search()、match()、findall()等)进行字符串处理,也可以先使用 re 模块的 compile() 方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串,接下来就跟大家介绍一下 re 模块的详细用法。
二、使用 re 模块匹配字符串
re 模块中提供了 match()、search() 和 findall() 等方法专门用来匹配字符串,可以从海量数据中精确筛选出需要的对象,我们逐一来看看每种方法的具体实现。
- 使用 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
re.match() 方法进行匹配
参考链接:
[1] python 中re.split()的用法 2019.9
[2] 百科:python正则表达式;
[3] Python 中re.split()方法 2019.9
[4] Python正则表达式 ;
[5] re — Regular expression operations¶ ;