python_regex
Posted xdl_smile
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python_regex相关的知识,希望对你有一定的参考价值。
正则表达
动机(目的):
1、处理文本成为计算机主要工作之一
2、根据文本内容进行固定搜索是文本处理的常见工作
3、为了快速方便的处理上述问题,正则表达式技术诞生,逐渐发展为一种单独技术被众多语言使用
定义:即高级文本匹配模式,提供了搜索,代替等功能,本质是由一些字符和特殊符号组成的字串。这个字串描述了字符和字符的重复行为,可可以匹配某些特征的字符串集合。
正则表达式的特点
1、方便进行检索和修改
2、支持众多语言
3、使用灵活变化多样
4、文本处理,mongo存储某一类型,django、tornado路由,爬虫文本匹配
正则的规则和用法:
import re
re.findall(regex,string)
1、功能:使用正则表达式匹配字符串
2、参数:regex:正则表达式,string目标字符串
3、返回值:匹配到的内容,一个列表
元字符:即正则表达式中含有特殊含义的字符
普通字符:
1、元字符:abc...
2、匹配规则:匹配相应的普通字符
3、示例:re.findall(‘ab‘,‘fdsfdsbdab‘)#[‘ab‘]
使用 或 多个正则同时匹配
1、元字符:|
2、匹配规则:符号两侧的正则均能匹配(符号两侧不要加空格)
3、示例:re.findall(‘ab|cd‘,‘fdcdsfcddsbabdab‘)#[‘cd‘, ‘cd‘, ‘ab‘, ‘ab‘]
匹配单一字符
1、元字符:.
2、匹配规则:匹配任意一个字符 ‘
’除外
3、示例:
1、re.findall(‘f.o‘,‘afdffoofds‘)#[‘ffo‘]
2、re.findall(‘f.o‘,‘afdff
oofds‘)#[],不能匹配
匹配字符串开头
1、元字符:^
2、匹配规则:匹配一个字符串的开头位置
3、示例:
1、re.findall(‘^hello‘,‘hello world‘)#[‘hello‘]
2、re.findall(‘^hello‘,‘ohello world‘)#[]
匹配字符串结尾
1、元字符:$
2、匹配规则:匹配一个字符串的结尾位置
3、示例:
1、re.findall(‘hello$‘,‘ohello hello‘)#[‘hello‘]
2、re.findall(‘hello$‘,‘ohello hellof‘)# []
匹配重复0次或多次
1、元字符:*
2、匹配规则:匹配前面出现的正则表达式0次或多次
2、示例:
1、re.findall(‘ab*‘,‘abcdaabbfdb‘)# [‘ab‘, ‘a‘, ‘abb‘]
匹配重复1次或多次:
1、元字符:+
2、匹配规则:匹配前面正则表达式至少出现一次
3、示例:re.findall(‘ab+‘,‘abcdaabbfdb‘)#[‘ab‘, ‘abb‘]
匹配重复0次或一次
1、元字符:?
2、匹配规则:匹配前面正则表达式0次或1次
3、示例:re.findall(‘ab?‘,‘abcdaabbfdb‘)#[‘ab‘, ‘a‘, ‘ab‘]
匹配重复指定次数
1、元字符:{N}
2、匹配规则:匹配前面的正则表达式N次
3、示例:re.findall(‘ab{2}‘,‘abcdaabbfdb‘)#[‘abb‘]
匹配重复指定参数范围
1、元字符:{N,M}
2、匹配规则:匹配前面正则表达式N次到M次(包括N和M)
3、示例:re.findall(‘ab{1,3}‘,‘abcdaabbfdb‘)# [‘ab‘, ‘abb‘]
字符集匹配:
1、元字符:[]
2、匹配规则:匹配中括号中的字符集,或者字符集区间的一个字符
3、示例:
1、[0-9]:匹配任意一个数字字符
2、[A-Z]:匹配任意一个大写字母
3、[a-z]:匹配任意一个小写字母
4、^[A-z][0-9a-z]{5}:匹配以大写字母开头,后面5为数字或小写字母
5、re.findall(‘^[A-Z][0-9a-z]{5}‘,‘Hello1 join‘)# [‘Hello1‘]
字符集不匹配:
1、元字符:[^...]
2、匹配规则:匹配出非字符集中任意一个字符
3、[^0-9]:匹配除了0-9的任意字符
匹配任意数字(非数字)字符:
1、元字符:d等价于[0-9] D等价于[^0-9]
2、匹配规则:d匹配任意一个数字字符 D匹配任意非数字字符
3、示例:re.findall(‘1d{10}‘,‘13333759329‘)#[‘13333759329‘]
匹配任意普字符或者特殊字符
1、元字符:w [_0-9a-zA-z] W[^_0-9a-zA-z]
2、匹配规则:w匹数字字母下划线 W匹配除了数字字母下划线的字符
3、示例:
1、re.findall(‘[A-z]w*‘,‘Hello World‘)# [‘Hello‘, ‘World‘]
2、re.findall(‘[A-Za-z]+-d+‘,‘wangming-56‘)#[‘wangming-56‘]
匹配任意空字符或非空字符:
1、元字符:s S
2、匹配规则:s任意空字符 [
]空格 换行 回车制表符 S任意非空字符
3、示例:re.findall(‘hellos+w+S‘,‘hello lily hello lucy hellofdsf‘)#[‘hello lily‘, ‘hello lucy‘]
匹配字符串的开头和结尾:
1、元字符:A等价于^ 等价于$
2、匹配规则:A表示匹配字符串开头位置 表示匹配字符串结尾位置
3、示例:re.findall(‘Aabc‘,‘abc‘)#[‘abc‘]严格匹配abc
匹配单词边界或非单词边界:
1、元字符: B
2、匹配规则:匹配一个单词的边界 B匹配一个单词的非边界
3、说明:数字字母下划线和其他字符的交界处认为是单词的边界
4、示例:
1、re.findall(‘is‘,‘This is a test‘)# [‘is‘, ‘is‘]
2、re.findall(r‘is‘,‘This is a test‘)#[‘is‘]匹配到后面的is(为退格有特殊含义所以要加r)
元字符总结:
1、匹配单个字符:. d D w W s S [...] [^...]
2、匹配重复次数:* + ? {N} {N,M}
3、匹配字符串位置:^ $ A B
4、其他:|
r子串和转义()
r 将字符变为raw字符串,不进行字符串的转义
示例:re.findall(‘\bis\b‘,‘This is a test‘)等价于re.findall(r‘is‘,‘This is a test‘)
贪婪和非贪婪:
1、和重复次数不确定的元字符相关:* + ? {N,M}
2、贪婪模式:在使用重复元字符的时候,元字符的匹配总是尽可能多的向后匹配更多的内容,贪婪模式为默认模式
示例:re.findall(‘ab*‘,‘abbbbbbbbgab‘)#[‘abbbbbbbb‘, ‘ab‘]尽可能多的匹配b
3、非贪婪模式:尽可能少的匹配内容,只要满足正则条件即可
示例:re.findall(‘ab*?‘,‘abbbbbbbbgab‘)# [‘a‘, ‘a‘]尽可能少的匹配b
正则表达式的分组:
1、使用()为正则表达式分组
2、(ab):表示给ab分了一个子组
3、正则表达式的子组用()表示,增加子组后对整体的匹配没有影响
4、每个正则表达式可以有多个子组,子组由外到内由左到右为第一第二第三......子组
5、子组表示一个内部整体,很多函数可以单独提取子组的值
6、子组可以改变重复行为,将子组作为整体重复
示例:re.match(‘(ab)+‘,‘ababfhdsabdfbsf‘).group(0)#‘abab‘
7、捕获组和非捕获组(命名组和非命名组)
1、格式:(?P<name>regex)
2、作用:
1、某些函数可以通过名字提取子组内容,或者通过名字进行键值对的生成
2、起了名字的子组可以通过名称重复使用
示例:re.match(‘(?P<str>ab)cd(?P=str)‘,‘abcdab‘).group()# ‘abcdab‘
练习:
1、匹配长度为8-10为的密码,必须以字母开头,数字字母下划线组成
re.findall(r‘^[a-zA-z]w{7,9}$‘,‘xfjsdjfk56‘)
2、匹配身份证号
re.findall(r‘d{17}[xd]‘,‘410422199212202556‘)
re模块
1、complie(pattern, flags=0)
1、功能:获取正则表达式对象
2、参数:
1、pattern:正则表达式
2、flags:功能标志位,提供正则表达式结果的辅助功能
3、返回值:返回相应的正则对象
4、说明:
1、compile函数返回值的属性函数和re模块属性函数有相同的部分
2、他们的功能完全相同
3、compile返回值对象属性函数中pattern和flags部分,因为这两个参数内容在compile生成对象时已经指明而re模块直接调用这些函数时则需要传入,
4、compile返回值对象属性函数参数中有pos和endpos参数,可以指明匹配目标字符串的起始和终止位置,而re模块直接调用这些函数时没有这个
2、findall(string,pos ,endpos)
1、功能:将正则表达式匹配到的内容存入列表返回
2、参数:要匹配的目标字符串
3、返回值:返回匹配到内容的列表,如果正则表达式中有子组则返回子组元组的列表
3、spilt(regex,string):
1、功能:以正则表达式切割字符串
2、参数
3、返回值:分割后的内容放入列表
4、sub()
1、功能:用替换字符串替换正则表达式匹配到的内容
2、参数
3、返回值:返回替换后的字符串
5、subn():
1、功能:同sub
2、参数:同sub
3、返回值:返回一个元组,元组中第一个元素为替换后的字符串,第二个为替换的次数
6、groupindex:compile对象属性,得到由捕获组名和第几个子组数字组成的字典
7、groups:compile对象属性,得到一共有多少个子组
import re pattern = r‘((?P<word>ab)cd(ef))‘ #创建正则表达式对象 obj = re.compile(pattern) l = obj.findall(‘abcdefghinabcdef‘) print(l) l1 = re.split(r‘s+‘,‘hello world nihao china‘) print(l1) s = re.sub(r‘[A-Z]‘,‘##‘,‘Hello World‘,1)#不给最后一个参数默认全部替换 print(s)# ##ello World s2 = re.subn(r‘[A-Z]‘,‘##‘,‘Hello World‘,1) print(s2)#(‘##ello World‘, 1) print(obj.groupindex)#{‘word‘: 2} print(obj.groups)#3
8、finditer()
1、功能:同findall查找所有正则匹配到的内容
2、参数:同findall
3、返回值:返回一个迭代器,迭代的每一项都是一个matchobj
4、match对象属性及函数
‘end‘, ‘endpos‘, ‘expand‘, ‘group‘, ‘groupdict‘, ‘groups‘, ‘lastgroup‘, ‘lastindex‘, ‘pos‘, ‘re‘, ‘regs‘, ‘span‘, ‘start‘, ‘string‘]
9、match()
1、功能:匹配一个字符串开头的位置
2、参数:目标字符串
3、返回值:如果匹配到返回一个matchobj,如果没有匹配到返回None
10、search()
1、功能:同match,只是可以匹配到任意位置,只能匹配一处
2、参数:目标字符串
3、返回值:如果匹配到返回一个matchobj,如果没有匹配到返回None
11、fullmatch()
1、功能:完全匹配,整个目标字符串完全由正则pp
2、参数:目标字符串
3、返回值:如果匹配到返回一个matchobj,如果没有匹配到返回None
import re obj = re.compile(r‘foo‘) iter_obj = obj.finditer(‘fdfoo,food the‘) for i in iter_obj: print(i.group()) print(‘**************‘) #match匹配开头 try: m_obj = obj.match(‘qfoo,food on the jfdksf ‘) print(m_obj.group()) except AttributeError: print(‘match none‘) #search匹配任意位置 try: m_obj = obj.search(‘qfoo,food on the jfdksf ‘) print(m_obj.group()) except AttributeError: print(‘match none‘)
以上是关于python_regex的主要内容,如果未能解决你的问题,请参考以下文章