1.正则表达式主要处理字符串,文本匹配的工具和库,不仅在python中使用,各编程语言都会用到。
2.正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
3.python中正则数量词分贪婪模式和非贪婪模式
贪婪模式总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*“如果用于查找"abbbc”,将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。
4.pyhon中的反斜杠
Python里的原生字符串的正则表达式可以使用r"\“表示。同样,匹配一个数字的”\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
5.匹配模式
正则表达式提供了一些可用的匹配模式,比如忽略大小写、多行匹配等,这部分内容将在Pattern类的工厂方法re.compile(pattern[, flags])
6.re模块
Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。
’/’字符,它是转义引导符号,跟在它后面的字符一般有特殊的含义。
‘^’ 号,则表示取非
两个规则并列起来,以‘|’连接,表示只要满足其中之一就可以匹配
关于’|’要注意两点:
1.它在[ ]之中不再表示或,而表示他本身的字符。如果要在[ ]外面表示一个’|’字符,必须用反斜杠引导,即 ’/|’ ;
2.它的有效范围是它两边的整条规则,比如‘dog|cat’匹配的是‘dog’和’cat’,而b不是’g’和’c’。如果想限定它的有效范围,必需使用一个无捕获组 ‘(?: )’包起来。比如要匹配 ‘I have a dog’或’I have a cat’,需要写成r’I have a (?:dog|cat)’ ,而不能写成 r’I have a dog|cat’
捕获组 ‘(?: )’:
当你要将一部分规则作为一个整体对它进行某些操作,比如指定其重复次数时,你需要将这部分规则用’(?:’ ‘)’把它包围起来,而不能仅仅只用一对括号,那样将得到绝对出人意料的结果。
s=’ababab abbabb aabaab’
re.findall( r’\b(?:ab)+\b’ , s )
['ababab']#结果
‘\b’ 匹配单词边界
s = 'abc abcde bc bcd'
re.findall( r’\bbc\b’ , s ) #匹配一个单独的单词 ‘bc’ ,而当它是其它单词的一部分的时候不匹配
['bc'] #只找到了那个单独的’bc’
re.findall( r’\sbc\s’ , s ) #匹配一个单独的单词 ‘bc’
[' bc '] #只找到那个单独的’bc’,不过注意前后有两个空格,可能有点看不清楚
# encoding: UTF-8
import re
# 将正则表达式编译成Pattern对象
pattern = re.compile(r'hello')
# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match('hello world!')
if match:
# 使用Match获得分组信息
print match.group()
### 输出 ###
# hello
import re
s='123abc456eabc789'
re.findall(r’abc’,s)
#结果就是:
['abc', 'abc']
这里用到的函数 ”findall(rule , target [,flag] )” 是个比较直观的函数,就是在目标字符串中查找符合规则的字符串。第一个参数是规则,第二个参数是目标字符串,后面还可以跟一个规则选项(选项功能将在compile函数的说明中详细说明)。返回结果结果是一个列表,中间存放的是符合规则的字符串。如果没有符合规则的字符串被找到,就返回一个空列表。
关于Pattern类和Match属性可方法可参考下述博客
博客主要参考python正则表达式
侵删。
相关博客:链接
7.match与search
match( rule , targetString [,flag] )
search( rule , targetString [,flag] )
(注:re的match 与search函数同compile过的Pattern对象的match与search函数的参数是不一样的。Pattern对象的match与search函数更为强大,是真正最常用的函数)
按照规则在目标字符串中进行匹配。
第一个参数是正则规则,第二个是目标字符串,第三个是选项(同compile函数的选项)
返回:若成功返回一个Match对象,失败无返回
findall虽然很直观,但是在进行更复杂的操作时,就有些力不从心了。此时更多的使用的是match和search函数。他们的参数和findall是一样的,都是:
match( rule , targetString [,flag] )
search( rule , targetString [,flag] )
不过它们的返回不是一个简单的字符串列表,而是一个MatchObject (如果匹配成功的话).。通过操作这个matchObject,我们可以得到更多的信息。
需要注意的是,如果匹配不成功,它们则返回一个NoneType。所以在对匹配完的结果进行操作之前,你必需先判断一下是否匹配成功了,比如:
m=re.match( rule , target )
if m:
m.group() #必需先判断是否成功
这两个函数唯一的区别是:match从字符串的开头开始匹配,如果开头位置没有匹配成功,就算失败了;而search会跳过开头,继续向后寻找是否有匹配的字符串。针对不同的需要,可以灵活使用这两个函数。
‘(‘’)’ 无命名组:
最基本的组是由一对圆括号括起来的正则式
s = "aaa111aaa , bbb222 , 333ccc"
re.findall (r'[a-z]+(\d+)[a-z]+' , s )
['111']#结果
可以看到findall函数只返回了包含在’()’中的内容,而虽然前面和后面的内容都匹配成功了,却并不包含在结果中。
几个简单的案例:
1.例如:找出字母g后面的字母不是u。
import re
words=['gold',' Google','Sogu','Guess']
patten = re.compile(r".*g[^u]")#之前写过(r"\w+g[^u]")没有考虑到w大小写问题可以写作patten = re.compile(r".*g[^u]",re.I)
for i in words:
g = re.match(patten,i)
if g:
print(i)
2.设计一个正则来过滤一个字符串序列中的10到59
import re
lis=[10,20,30,40,2,3,59,60,'aa','3aaa']
patten = re.compile(r"[1-5][0-9]")
j=[]
for i in lis:
g = re.match(patten,str(i))
if g:
j.append(i)
print(j)
3.过滤字符串中的只含2个字符的字母,并且第一个字母是大写A或B或C
patten = r"[ABC]." patten = r'[A-C][A-Z a-z]'
4.过滤一个字符串中的含3个字母的独立字符,比如这样的一个字符串’xy,1,2,?,123@sohu,Ab,w1,Cz,xyh,abc’,只想过滤出来xyh,abc 这样的
patten=r"re.compile(r"\b\w{3}\b",re.I)"
re.findall(patten," ")
5.过滤一个字符串中的含3个字母的字符,并且最后一个字母是z
patten = r"\b[a-zA-Z]{2}z\b"
6.过滤正确的24小时时间制
r'\b([01]?[0-9]|2[0-4])(:)([0-5][0-9])'
一些常用的正则表达式: 以下转载自链接
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(\S*?)[^>]>.?\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):1[a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+.\d+.\d+.\d+
评注:提取ip地址时有用
匹配特定数字:
2\d*KaTeX parse error: Undefined control sequence: \d at position 20: …//匹配正整数 ^-[1-9]\̲d̲* //匹配负整数
^-?[1-9]\d*KaTeX parse error: Undefined control sequence: \d at position 17: … //匹配整数 ^[1-9]\̲d̲*|0 //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0KaTeX parse error: Undefined control sequence: \d at position 28: …负整数 + 0) ^[1-9]\̲d̲*\.\d*|0\.\d*[1… //匹配正浮点数
^-([1-9]\d*.\d*|0.\d*[1-9]\d*)KaTeX parse error: Undefined control sequence: \d at position 21: …配负浮点数 ^-?([1-9]\̲d̲*\.\d*|0\.\d*[1… //匹配浮点数
3\d*.\d*|0.\d*[1-9]\d*|0?.0+|0KaTeX parse error: Undefined control sequence: \d at position 33: … + 0) ^(-([1-9]\̲d̲*\.\d*|0\.\d*[1… //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
4+ / / 匹 配 由 26 个 英 文 字 母 组 成 的 字 符 串 [ A − Z ] + //匹配由26个英文字母组成的字符串 ^[A-Z]+ //匹配由26个英文字母组成的字符串[A−Z]+ //匹配由26个英文字母的大写组成的字符串
5+ / / 匹 配 由 26 个 英 文 字 母 的 小 写 组 成 的 字 符 串 [ A − Z a − z 0 − 9 ] + //匹配由26个英文字母的小写组成的字符串 ^[A-Za-z0-9]+ //匹配由26个英文字母的小写组成的字符串[A−Za−z0−9]+ //匹配由数字和26个英文字母组成的字符串
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
[\u4e00-\u9fa5] //匹配中文
a-zA-Z ↩︎
1-9 ↩︎
1-9 ↩︎
A-Za-z ↩︎
a-z ↩︎