在Python中,有4个常见的正则处理文本的场景:校验文本内容;提取文本内容;替换文本内容;切割文本内容。
1、校验文本内容
Python中,正则处理相关的方法在re包中,可以使用re.match 或 re.search来校验文本。
import re
myre = re.compile(r'\A\d{4}-\d{2}-\d{2}\Z')
#\A开始匹配,\Z匹配结束
print(myre.match('2020-07-08') is not None)
print(myre.search('2020-07-08') is not None)
2、提取文本内容
Python中,使用re.findall()来提取文本内容。当有子组的时候,会返回子组的内容,没有子组时,返回整个正则匹配到的内容。
import re
#没有子组时
myre = re.compile(r'\d{4}-\d{2}')
print(myre.findall('2020-07 2020-08'))
#有子组时
myre1 = re.compile(r'(\d{4})-(\d{2})')
print(myre1.findall('2020-07 2020-08'))
# ['2020-07', '2020-08']
# [('2020', '07'), ('2020', '08')]
#使用迭代器遍历匹配后内容
for match in myre1.finditer('2020-07 2020-08'):
print('date: ', match[0]) # 整个正则匹配到的内容
print('year: ', match[1]) # 第一个子组
print('month:', match[2])
# date: 2020-07
# year: 2020
# month: 07
# date: 2020-08
# year: 2020
# month: 08
3、替换文本内容
Python中常用re.sub和re.subn方法进行文本替换,re.subn返回替换的次数。
import re
myre = re.compile(r'(\d{2})-(\d{2})-(\d{4})')
print(myre.sub(r'\3年\1月\2日', '06-20-2020 07-21-2020'))
#2020年06月20日 2020年07月21日
# 可以在替换中使用 \g<数字>,如果分组多于10个时避免歧义
print(myre.sub(r'\g<3>年\g<1>月\g<2>日', '06-20-2020 07-21-2020'))
#2020年06月20日 2020年07月21日
# 返回替换次数
print(myre.subn(r'\3年\1月\2日', '06-20-2020 07-21-2020'))
#('2020年06月20日 2020年07月21日', 2)
4、切割文本内容
Python中,对于空格分隔的字符串可以使用split()方法,split也可指定字符分隔。
mystr1 = "I am aojin"
mystr2 = "I-am-aojin"
#默认空格分隔
print(mystr1.split())
#['I', 'am', 'aojin']
#指定分隔符
print(mystr2.split('-'))
#['I', 'am', 'aojin']
re包中的split方法也可以进行字符串分隔。
import re
#通过标点符号切割
myre = re.compile(r'\W+')
print(myre.split("I, am! Ao; jin"))
# ['I', 'am', 'Ao', 'jin']
# 只切割一次
print(myre.split("I, am! Ao; jin", 1))
# ['I', 'am! Ao; jin']