python提供了内置模块re,和第三方模块regex来支持正则表达式
这次只介绍re模块
使用
基本语法:
.:匹配处理换行的任意字符
^:匹配字符串的开头
$:匹配字符串尾
字符:*,+,?:0到n,1到n,0到1
{m,n}:前一个字符m到n次
\:转义字符
[]:表示字符集合
():表达式分组?
|:标识逻辑或,左右任意一个表达式
\number:匹配数字代表的组合
\b:匹配空字符串,只在单词开始或结尾的位置
\B:匹配空字符串,除了单词开始或结尾的位置
\d:匹配数字【0-9】
\D:匹配任何非十进制数字字符
\s:匹配空白字符
\S:匹配非空白字符
\w:匹配【a-zA-Z0-9】
\W:匹配非单词字符
\Z:只匹配字符串尾
re模块内容:
主要方法:re.complie(pattern,flags=0)
用于编译正则表达式,生成一个正则表达式(pattern)对象,供match()和search()两个函数使用。
参数介绍:
pattern:字符串形式的正则表达式
flags:匹配模式,包括:
re.A:只匹配ASCⅡ码
re.I:忽略大小写
re.M:多行模式
re.L:由当前语言区域决定\w,\W,\b,\B和大小写敏感匹配
re.S:。匹配包括换行符在内的任意字符
re.U:冗余,python3中字符串默认是Unicode编码
re.X:忽略空格和#后面的注释
示例:
使用python3.9解释器,亲测有效。
import re
re.compile(r'asdf', re.I)
re.search(pattern,string,flags=0)
扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象。如果没有匹配,就返回None。
参数介绍:
pattern:匹配的正则表达式
stirng:要匹配的字符串
flags:匹配模式
import re
print(re.search(r'asdf','asdfqwer'))
print(re.search(r'asdf','aSdFqwer',re.I))
re.match(pattern,string,flags=0)
扫描整个字符串,找到匹配样式的第一个位置,并返回相应的匹配对象。如果没有匹配就返回None
参数介绍同上:
pattern:匹配的正则表达式
stirng:要匹配的字符串
flags:匹配模式
示例:
import re
print(re.match(r'asd','asdf'))
re.fullmatch(pattern,string,flags=0)
如果string开始的0或者多个字符完全匹配到了正则表达式样式,就返回一个相应的匹配对象。如果没有,就返回None
示例:
import re
print(re.fullmatch(r'asd', 'asdf'))
print(re.fullmatch(r'asd','asd'))
re.split(pattern,string,maxsplit=0,flags=0)
用pattern分开string,如果在pattern中捕获括号,那么所有的组里的pattern也会包含在列表中,如果maxsplit非零,最多进行maxsplit次分隔,剩下的字符全部返回到列表的最后一个元素。
import re
print(re.split(r'\W+', 'ityard,ityard,ityard.'))
print(re.split(r'(\W+)', 'ityard,ityard,ityard.'))
print(re.split(r'\W+', 'ityard,ityard,ityard.', 1))
print(re.split('[a-f]+','1A2b3',flags=re.IGNORECASE))
re.findall(pattern,string,flags=0)
对string返回一个不重复的pattern的匹配列表
import re
print(re.findall(r'ab','abefabdeab'))
re.finditer(pattern,string,flags=0)
返回为一个迭代器,从左到右扫描
import re
# it=re.finditer(r'\d+','12ab34cd56')
it=re.finditer(r'\d+','43aa43aa21aa')
for match in it:
print(match)
re.sub(pattern,repl,string,count=0,flags=0)
返回通过使用repl替换在string最左边非重叠出现的pattern而得到的字符串,count表示匹配后出现的最大次数默认为0表示替换所有匹配。
import re
str='ityard # 不是我的名字'
print(re.sub(r'#.*$', '', str))
re.subn(pattern,repl,string,count=0,flags=0)
行为与re.sub()相同,返回的是一个元组
import re
str='alex # 是我的名字'
print(re.subn(r'#.*$', '', str))
re.excape(pattern)
转义它的特殊字符
import re
print(re.escape('https://blog.csdn.net/alex'))
re.purge()
清除正则表达式缓存
正则对象
正则对象的相应方法:
import re
pattern=re.compile(r'bc', re.I)
print(pattern.search('aBcdef'))
print(pattern.search('aBcdef',1,3))
print(pattern.match('aBcdef'))# None
print(pattern.match('aBcdef',1,3))
print(pattern.fullmatch('aBcdef',1,3))
print(pattern.split('abc,aBcd,abcde.'))# []
print(pattern.findall('abcdefabCdeABC'))# []
print(pattern.findall('abcdefabCdeABC',0,6))# []
it=pattern.finditer('12bc34BC56', 0, 6)
for match in it:
print(match)
import re
pattern=re.compile(r'#.*$')
str='alex # 是我的名字'
print(pattern.sub('',str))
print(pattern.subn('',str))
匹配对象
Match.expand(template)
对template进行反斜杠转义替换并且返回
import re
match=re.match(r'(?P<year>\w+) (?P<month>\w+)', '2020 01')
print(match.expand(r'现在是\1年\2月'))
Match.group([group1,…])
返回一个或多个匹配的子组
import re
match=re.match(r'(?P<year>\w+) (?P<month>\w+)', '2021 12')
print(match.group(0))
print(match.group(1))
print(match.group(2))
Match.groups(default=None)
返回一个元组,包含所有匹配的子组,在样式中出现的从1到任意多的组合
default参数用于不参与匹配的组合,默认为None
import re
match=re.match(r'(?P<year>\w+) (?P<month>\w+)','2020 01')
print(match.groups())
Match.groupdict(default=None)
返回一个字典,包含所有的命名子组,default用于不参与匹配的组合,默认为None
import re
match=re.match('(?P<year>\w+) (?P<month>\w+)', '2020 02')
print(match.groupdict())
Match.start([group])和Match.end([group])
返回group匹配到的字符串的开始和结束标号
import re
match=re.match('(?P<year>\w+) (?P<month>\w+)', '2020 02')
print(match.start())
print(match.end())
Match.span([group])
对于一个匹配m,返回一个二元组(m.start(group),m.end(group))。
import re
match=re.match('(?P<year>\w+) (?P<month>\w+)', '2020 02')
print(match.span())