-
()
:正则表达式的组选择。组
就是把 正则表达式 匹配的内容 里面其中的某些部分
标记为某个组。pythonimport re content = """苹果,苹果是绿色的 橙子,橙子是橙色的 香蕉,香蕉是黄色的 """ p = re.compile('^(.*),', re.M) for v in p.findall(content): print(v) # 苹果 # 橙子 # 香蕉
pythonimport re content = """张三,手机号码15945678901 李四,手机号码13945677701 王二,手机号码13845666901 """ p = re.compile('^(.+),.+(\d{11})', re.M) for v in p.findall(content): print(v) # ('张三', '15945678901') # ('李四', '13945677701') # ('王二', '13845666901')
当有多个分组的时候,我们可以使用
(?P<分组名>...)
这样的格式,给每个分组命名。这样做的好处是,更方便后续的代码提取每个分组里面的内容:pythonimport re content = """张三,手机号码15945678901 李四,手机号码13945677701 王二,手机号码13845666901 """ p = re.compile('^(?P<name>.+),.+(?P<phone>\d{11})', re.M) for v in p.finditer(content): print(v.group('name')) print(v.group('phone')) # 张三 # 15945678901 # 李四 # 13945677701 # 王二 # 13845666901
-
.
去匹配换行。需要
点也匹配换行符
,可以使用DOTALL
参数pythoncontent = ''' <div class="el"> <p class="t1"> <span> <a>Python开发工程师</a> </span> </p> <span class="t2">南京</span> <span class="t3">1.5-2万/月</span> </div> <div class="el"> <p class="t1"> <span> <a>java开发工程师</a> </span> </p> <span class="t2">苏州</span> <span class="t3">1.5-2/月</span> </div> ''' import re p = re.compile(r'class=\"t1\">.*?<a>(.*?)</a>', re.DOTALL) for one in p.findall(content): print(one) # Python开发工程师 # java开发工程师
切割字符串
字符串 对象的 split
方法只适用于 简单的字符串分割。 有时,你需要更加灵活的字符串切割。
比如,我们需要从下面字符串中提取武将的名字。
names = '关羽; 张飞, 赵云,马超, 黄忠 李逵'
我们发现这些名字之间, 有的是分号隔开,有的是逗号隔开,有的是空格隔开, 而且分割符号周围还有不定数量的空格
这时,可以使用正则表达式里面的 split 方法:
python
import re
names = '关羽; 张飞, 赵云, 马超, 黄忠 李逵'
namelist = re.split(r'[;,\s]\s*', names)
print(' '.join(namelist))
# 关羽 张飞 赵云 马超 黄忠 李逵
字符串替换
python
import re
names = '''
下面是这学期要学习的课程:
<a href='https://www.bilibili.com/video/av66771949/?p=1' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是牛顿第2运动定律
<a href='https://www.bilibili.com/video/av46349552/?p=125' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是毕达哥拉斯公式
<a href='https://www.bilibili.com/video/av90571967/?p=33' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是切割磁力线
'''
newStr = re.sub(r'/av\d+/', '/cn345677/' , names)
print(newStr)
"""
下面是这学期要学习的课程:
<a href='https://www.bilibili.com/video/cn345677/?p=1' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是牛顿第2运动定律
<a href='https://www.bilibili.com/video/cn345677/?p=125' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是毕达哥拉斯公式
<a href='https://www.bilibili.com/video/cn345677/?p=33' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是切割磁力线
"""
高级替换
python
import re
names = '''
下面是这学期要学习的课程:
<a href='https://www.bilibili.com/video/av66771949/?p=1' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是牛顿第2运动定律
<a href='https://www.bilibili.com/video/av46349552/?p=125' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是毕达哥拉斯公式
<a href='https://www.bilibili.com/video/av90571967/?p=33' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是切割磁力线
'''
# 替换函数,参数是 Match对象
def subFunc(match):
# Match对象 的 group(0) 返回的是整个匹配上的字符串,
src = match.group(0)
print(src)
# Match对象 的 group(1) 返回的是第一个group分组的内容
print(match.group(1))
number = int(match.group(1)) + 6
dest = f'/av{number}/'
print(f'{src} 替换为 {dest}')
# 返回值就是最终替换的字符串
return dest
newStr = re.sub(r'/av(\d+)/', subFunc , names)
print(newStr)
"""
下面是这学期要学习的课程:
<a href='https://www.bilibili.com/video/av66771955/?p=1' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是牛顿第2运动定律
<a href='https://www.bilibili.com/video/av46349558/?p=125' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是毕达哥拉斯公式
<a href='https://www.bilibili.com/video/av90571973/?p=33' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是切割磁力线
"""