python基础知识--8正则表达式

1.正则表达式


# 正则表达式
# 通俗而言,就是通过某种规则,来匹配符合条件的字符序列。


# 适用场景:
# 快速地查找、替换或匹配具有特殊格式的字符;
# 如:
# 文本替换;
# 匹配电子邮箱、电话号码、IP地址等;
# 匹配爬虫程序中,某些特殊格式的字符。


import re

re.findall(pattern, string, flags=0) # 会将所有符合条件的字符,放在一个列表中


# pattern 指的是,正则表达式匹配规则
# string 指的是,要进行匹配的字符串
# flags 指的是,可选参数,进行特定条件的匹配

# 需求:
# 匹配字符串中的所有 lemon

match_str = 'lemon&apple&lemoon&banana&lemooon&pear&lemoooon'

re.findall('lemon',match_str) # lemon 普通字符
运行:
['lemon']

#%%

# 需求
# 1.除了匹配 lemon,还想把 lemoon lemooon lemoooooon 给匹配出来

re.findall('lemo{1,4}n',match_str)

运行结果:
['lemon', 'lemoon', 'lemooon', 'lemoooon']
2.字符集
# 被匹配的字符集合

import re


match_str = 'bac | bbc | bcc | bdc | bec'

# 需求:
# 1.匹配 bac 或 bbc

re.findall('b[ab]c',match_str)

运行结果:
['bac', 'bbc']


re.findall('b[^ab]c',match_str) # ^ 取反
运行结果:
['bcc', 'bdc', 'bec']
# 需求
# 1.匹配 bac 或 bbc 或 bcc 或 bdc

re.findall('b[abcd]c',match_str) # [abcd]
运行结果:
['bac', 'bbc', 'bcc', 'bdc']
#%%

re.findall('b[a-d]c',match_str) # [a-d]
运行结果:

['bac', 'bbc', 'bcc', 'bdc']
#%%

re.findall('b[^a-d]c',match_str) # [^a-d] [^abcd]
运行结果:
['bec']
#%%
3.常见元字符

import re

# 数字字符
# \d 匹配一个数字字符
# \D 匹配一个非数字字符

match_str = '&a0b12c344d55&AC_'

re.findall('\d',match_str)
运行结果:
['0', '1', '2', '3', '4', '4', '5', '5']

re.findall('\D',match_str)
运行结果:
['&', 'a', 'b', 'c', 'd', '&', 'A', 'C', '_']

# 单词字符

# \w 匹配一个包括下划线的单词字符 A-Za-z0-9_
# \W 匹配一个非包括下划线的单词字符

#%%

match_str = '&a0b12c344d55&AC_'

re.findall('\w',match_str)
运行结果:
['a', '0', 'b', '1', '2', 'c', '3', '4', '4', 'd', '5', '5', 'A', 'C', '_']


re.findall('\W',match_str)
运行结果:

['&', '&']

# 空白字符

# \s 匹配一个空白字符 如空格、制表符、换页符等
# \S 匹配一个非空白字符

#%%

match_str = '\r\t&a0b12c344d55&AC_ \n'


re.findall('\s',match_str)
运行结果:

['\r', '\t', ' ', '\n']


re.findall('\S',match_str)
运行结果:
['&','a','0','b','1','2','c','3','4','4','d','5','5','&','A','C','_']
4.数量词

import re

match_str = '&a0b12c344d55&AC_6789'

# 需求:
# 1.想取出完整的数字集合 如 0、12、344、55


re.findall('\d{1,}',match_str)

运行结果:
['0', '12', '344', '55', '6789']
# {1,3} 代表匹配前面的字符,1次到3次
# {1,} 代表匹配前面的字符,1次到N次

#%%

match_str2 = 'lemon12banana34pear56'

# 需求:
# 1.想取出完整的单词集合 如 lemon、 banana、 pear

# \w A-Za-z0-9_

#%%

re.findall('[a-z]{4,6}',match_str2)
运行结果:
['lemon', 'banana', 'pear']
5.贪婪与非贪婪

import re

match_str = 'lemon12banana34pear56'

re.findall('[a-z]{4,6}?',match_str)
运行结果:
['lemo', 'bana', 'pear']

re.findall('[a-z]{4,6}',match_str)
运行结果:

['lemon', 'banana', 'pear']
#%%

# 数量词
# 贪婪 倾向于最大长度匹配
# 非贪婪 倾向于最小长度匹配

#%%

match_str = 'lemooooo'

re.findall('lemo{1,}',match_str)
运行结果:
['lemooooo']

re.findall('lemo{1,}?',match_str)
运行结果:
['lemo']
# 贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配;
# 非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。

6.次数匹配

re.findall('\d{1,3}',match_str) # 代表匹配前面的数字字符,1次到3次
re.findall('\d{1,}' ,match_str) # 代表匹配前面的数字字符,1次到N次


import re


# * 代表匹配前面的字符零次或多次 {0,}
# + 代表匹配前面的字符一次或多次 {1,}
# ? 代表匹配前面的字符零次或一次 {0,1}


#%%

match_str = 'lemo123 lemon345 lemonnnn567'


re.findall('lemon*',match_str)
运行结果:
['lemo', 'lemon', 'lemonnnn']


re.findall('lemon+',match_str)
运行结果:
['lemon', 'lemonnnn']

re.findall('lemon?',match_str)
运行结果:

['lemo', 'lemon', 'lemon']

# 对于 ? 总结

# 1.如果数量词后面有 ?,该 ? 代表非贪婪的关键字,倾向于取最小长度匹配
# 2.如果字符 后面有 ?,该 ? 代表匹配前面字符 0次或1次

7.定位符

import re

match_str = 'abcdef 123456 abcdef 456 abc'


# 需求1:
# 匹配所有的单词字符集合 如 abcdef abcdef abc

re.findall('[a-z]{3,6}',match_str)
运行结果:
['abcdef', 'abcdef', 'abc']
# 需求2:
# 1.匹配第一个的单词字符集合 如 abcdef
# 2.匹配最后一个的单词字符集合 如 abc

# 定位符用来匹配字符串的边界


^ 匹配字符串开始的位置

match_str = 'abcdef 123456 abcdef 456 abc'

re.findall('^[a-z]{6}',match_str)

运行结果:
['abcdef']


[^abc]


$ 匹配字符串结尾的位置


match_str = 'abcdef 123456 abcdef 456 abc'


re.findall('[a-z]{3}$',match_str)

运行结果:
['abc']

8.组的匹配

import re

match_str = 'lemonlemonlemonappleapplepearpear'


re.findall('(lemon){3}',match_str)
运行结果:
['lemon']

# 一组字符的集合

re.search('(lemon){3}',match_str).group()
运行结果:
'lemonlemonlemon'

组 与 字符集 区别



(lemon) 匹配 lemon 这一组字符
[lemon] 匹配 括号中的任意一个字母

re.findall('(lemon){3}',match_str)
运行结果:
['lemon']

re.findall('[lemon]',match_str)
运行结果:
['l','e','m','o','n','l','e','m','o','n','l','e','m','o','n','l','e','l','e','e' 'e']

9.FLAGS可选参数

import re
re.findall(pattern, string, flags=0)

# pattern 指的是,正则表达式匹配规则
# string 指的是,要进行匹配的字符串
# flags 指的是,可选参数,进行特定条件的匹配

match_str = 'lemon\n LEMON\n'

re.findall('lemon.',match_str,re.I | re.S)
运行结果:
['lemon\n', 'LEMON\n']
# 补充元字符

.

匹配除“\n”之外的任何单个字符

match_str = '\n123 abc\r'


re.findall('.',match_str,re.S)
运行结果:
['\n', '1', '2', '3', ' ', 'a', 'b', 'c', '\r']
 
10.MATCH函数与SERARCH函数
'''
re.findall(pattern, string, flags=0)

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

'''

#%%

'''
re.findall 搜索整个字符串,返回所有匹配项

re.match 从字符串首字符开始匹配,若首字符不匹配,则返回None,若匹配则返回第一个匹配对象。
re.search 搜索整个字符串, 若全都不匹配,则返回None,若匹配则返回第一个匹配对象。
'''

import re

match_str = 'a5678 lemon 1234'

re.findall('\d',match_str)
运行结果:
['5', '6', '7', '8', '1', '2', '3', '4']

re.match('\d',match_str)

运行结果:
<_sre.SRE_Match object; span=(0, 1), match='5'>


re.search('\d',match_str)
运行结果:
<_sre.SRE_Match object; span=(1, 2), match='5'>

11.Group组匹配
# group(0) 记录的是完整匹配的结果


# 用 () 来表示其中的内容属于一个分组

import re


match_str = 'life is mostly happy,but sometimes sad'

# 需求:
# 1.将 is mostly happy,but sometimes 匹配出来
# 2.将 is mostly happy 以及 sometimes 分别匹配出来

#%%

r = re.search('life(.*)sad',match_str)
r
运行结果:
<_sre.SRE_Match object; span=(0, 38), match='life is mostly happy,but sometimes sad'>


r.group(0)

运行结果:

'life is mostly happy,but sometimes sad'

r.group(1)

运行结果:

' is mostly happy,but sometimes '



#%%

r1 = re.search('life(.*)but(.*)sad',match_str)
r1

r1.group(1)

运行结果:
' is mostly happy,'

r1.group(2)

运行结果:
' sometimes '

r1.groups()

运行结果:
(' is mostly happy,', ' sometimes ')

12.正则替换

# re.sub(pattern, repl, string, count=0, flags=0)

# pattern 正则表达式
# repl 要替换的内容,也可传入函数
# string 被替换的字符串
# count 默认为0,代表全部替换 。
# 1 代表替换1次,
# 2 代表替换2次,以此类推

#%%

import re

match_str = 'lemon apple 123456789 lemon lemon'

# 需求
# 将lemon 全都转为 a


re.sub('lemon','a',match_str,count=2)
运行结果:
'a apple 123456789 a  lemon'

# 需求 xx
# 数字 小于 7的,都转为 0 , 数字 大于等于 7的,都转为 10

#%%

match_str = 'lemon apple 123456789 lemon lemon'

def transform(value):
match_num = value.group()
print(match_num)
if int(match_num) < 7:
return '0'
return '10'

re.sub('\d',transform,match_str,count=0)
运行结果:
1
2
3
4
5
6
7
8
9
'lemon apple 000000101010 lemon  lemon'


posted on 2020-10-23 11:58  kunlungege  阅读(126)  评论(0编辑  收藏  举报

导航