1、正则一般流程
#导入正则模块import re#编译正则模式对象regex = re.compile('string')#使用正则模式匹配字符串,返回字符串中第一次匹配模式的match对象m = regex.search(stringobject)print m.group()#match对象使用group方法获取匹配文本 #当模式中有()包含时,可以使用对应的数值参数精确提取(如 1,2,3等等) #不传参数或0返回整个匹配文本print m.groups()#一次返回所有分组
2、正则常用模式
re.search(r'batman|spiderman',string) #使用管道符进行多项可能的匹配re.search(r'Bat(man|mobile|copter)',string)#使用管道符进行多项可能的匹配re.search(r'Bat(wo)?man',string) # 字符?表明它前面的分组是可选,出现0次或1次re.search(r'Bat(wo)*man',string) # 字符*表明它前面的分组是可选,出现0次或多(n=1,2...)次re.search(r'Bat(wo)+man',string) # 字符+表明它前面的分组是必选,出现1次或多(n=2,3...)次re.search(r'Bat(wo){m,n}man',string) # {}指定前面分组出现的次数,最少m次,最多n次#Python 的正则表达式默认是“ 贪心” 的, 这表示在有二义的情况下,它们会尽可能匹配最长的字符串。#请注意, 问号在正则表达式中可能有两种含义: 声明非贪心匹配或表示可选的分组。这两种含义是完全无关的re.search(r'Bat(wo){m,n}?man',string)#在花括号后方跟上?,变为非贪心模式,匹配符合条件的最短串#要让正则表达式不区分大小写,可以向 re.compile()传入 re.IGNORECASE 或 re.I,作为第二个参数regex = re.compile(r'WeRwT',re.I)
3、findall()
- 如果调用在一个没有分组的正则表达式上, 例如\d\d\d-\d\d\d-\d\d\d\d, 方法findall()将返回一个匹配字符串的列表, 例如['415-555-9999', '212-555-0000']。
- 如果调用在一个有分组的正则表达式上, 例如(\d\d\d)-(\d\d\d)-(\d\d\d\d), 方法 findall()将返回一个字符串的元组的列表 ( 每个分组对应一个字符串),例如[('415','555', '1122'), ('212', '555', '0000')]。
4、字符分类集合
- \w 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
- \W 除字母、数字和下划线以外的任何字符
- \s 空格、制表符或换行符(可以认为是匹配“空白”字符)
- \S 除空格、制表符和换行符以外的任何字符
- \d 数字0-9
- \D 非数字,即[^\d]
- 自定义字符集[aeiouAEIOU],使用中括号包含。
5、通配符 "." :
默认匹配除换行以外的所有字符,通过传入 re.DOTALL 作为 re.compile()的第二个参数, 可以让句点字符匹配所有字符, 包括换行字符。
noNewlineRegex = re.compile('.*')noNewlineRegex.search('Serve the public trust.\nProtect the innocent\nUphold the law.').group()#'Serve the public trust.'newlineRegex = re.compile('.*', re.DOTALL)newlineRegex.search('Serve the public trust.\nProtect the innocent\nUphold the law.').group()#'Serve the public trust.\nProtect the innocent.\nUphold the law.'
6、使用sub()方法替换字符串
有时候,你可能需要使用匹配的文本本身,作为替换的一部分。在 sub()的第一个参数中,可以输入\1、 \2、 \3……,表示“在替换中输入分组 1、 2、 3……的文本”。
namesRegex = re.compile(r'Agent \w+')namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.')#'CENSORED gave the secret documents to CENSORED.agentNamesRegex = re.compile(r'Agent (\w)\w*')agentNamesRegex.sub(r'\1****', 'Agent Alice told Agent Carol that Agent Eve knew Agent Bob \ was a double agent.')#A**** told C**** that E**** knew B**** was a double agent.'