re库高级用法

1. 自动分组

        分组的方法:将子表达式用小括号括起来,如:(exp),表示匹配表达式exp,并捕获文本到自动命名的组里

import re

s = 'a1b2 c3d4 ea7f'
p1 = re.compile(r'[a-z]\d[a-z]\d')

print(re.findall(p1,s))

p2 = re.compile(r'[a-z]\d[a-z](\d)')

print(re.findall(p2,s))

p3 = re.compile(r'[a-z](\d)[a-z](\d)')

print(re.findall(p3, s))

 group()值等于group(0)

import re

s = 'age:13,name:Tom;age:18,name:John'
p = re.compile(r'age:(\d+),name:(\w+)')
it = re.finditer(p, s)
for m in it:
    print('------')
    print(m.group())
    print(m.group(0))
    print(m.group(1))
    print(m.group(2))

2. 忽略某个分组

        有时候给正则的某个子表达式加括号并不是为了分组,而仅仅是为了看起来更清晰,因此在匹配结果中并不想匹配该子表达式,那么该怎么办呢?答案是忽略该分组,方法:(?:exp)。举例:只想匹配name,不想匹配age

import re

s = 'age:13,name:Tom'
p1 = re.compile(r'age:(\d+),name:(\w+)')
# 不忽略分组
print(re.findall(p1, s))

# 忽略分组
p2 = re.compile(r'age:(?:\d+),name:(\w+)')
print(re.findall(p2, s))

3. 后向引用

        所谓后向引用,就是对前面出现过的分组再一次引用,使用默认的分组名称进行后向引用:\1,\2,\3...(注:从1开始)

import re

# 匹配字符串中连续出现的两个相同的单词
s = 'hello blue go go hello'
p = re.compile(r'\b(\w+)\b\s+\1\b')  # 这里的'\1'就对应前面的(\w+)
print(re.findall(p,s))

4. 自定义名称分组的后向引用

        python正则可以对分组自定义名称,然后可以使用自定义名称进行后向引用,使用自定义分组名称比使用默认分组名称更加清晰、更容易让人理解。

对分组自定义名称的方法:

(?P<myname>exp)

后向引用的方式:

(?P=myname)
import re

s = 'hello blue go go hello'
p = re.compile(r'\b(?P<my_group1>\w+)\b\s+(?P=my_group1)\b')
print(re.findall(p,s))

这里要注意的是,其他语言的正则与python正则的分组自定义名称的语法不太一样,其他语言是这样写的:

# 自定义名称
(?<name>exp)
# 后向引用
\K<name>

5.嵌套分组

        分组的序号是以左小括号(从左到右的顺序为准的。

import re

s = '2017-07-10 20:00'
p = re.compile(r'(((\d{4})-\d{2})-\d{2}) (\d{2}):(\d{2})')
r = re.findall(p, s)
print(r)

se = re.search(p, s)
print(se.group())
print(se.group(0))
print(se.group(1))
print(se.group(2))
print(se.group(3))
print(se.group(4))
print(se.group(5))

6. 后向引用的应用

1. 匹配"ABAB"型字符串

import re

s = 'abab ccdc xxyy'
p = re.compile(r'(\w\w)\1')
r = re.finditer(p, s)
for i in list(r):
    print(i.group())

2. 匹配"AABB"型字符串

import re

s = 'abab ccdc xxyy'
p = re.compile(r'(\w)\1(\w)\2')
r = re.finditer(p, s)
for i in list(r):
    print(i.group())

3. 匹配"AABA"型字符串

import re

s = 'abab ccdc xxyy'
p = re.compile(r'(\w)\1(?:\w)\1')
r = re.finditer(p, s)
for i in list(r):
    print(i.group())

4. 向字符串中的某些位置插入字符

需求:通配符%_[]前都加上\符进行转义,如果通配符前面本来就有\,则不再插入

第一种方法:exp1(?=exp2),查找exp2前面的exp1;exp1(?!exp2),查找非exp2前面的exp1

import re

s = 'abc\\_de%fgh[c][]c]'
print('s = {0}'.format(s))
print(re.sub(r'([^\\])(?=[%_\[\]])', r'\1\\', s))

第二种方法:(?<=exp2)exp1,查找exp2后面的exp1;(?<!exp2)exp1,查找非exp2后面的exp1

import re

s = 'abc\\_de%fgh[c][]c]'
print('s = {0}'.format(s))
print(re.sub(r'(?<!\\)([%_\[\]])', r'\\\1', s))

5. 在字符串中从后往前每隔3个字符插入一个,符号

import re

s = '1234567890'
s = s[::-1]
s = re.sub(r'(...)', r'\1,', s)
print(s)
print(s[::-1])

7.sub替换的应用

         repl参数可以是一个字符串,也可以是一个callable对象(函数)支持对pattern中分组的后向引用

import re

# 下划线转化成驼峰
s = 'go_to_next_page'
s = re.sub(r'(_\w)', lambda x: x.group(1)[1].upper(), s)
print(s)
import re

s = 'goToNextPage'
p = re.compile(r'([a-z]|\d)([A-Z])')
# 这里repl参数使用了正则分组的后向引用
s = re.sub(p, r'\1_\2', s).lower()
print(s)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值