Python正则表达式

正则表达式

1.正则表达式主要处理字符串,文本匹配的工具和库,不仅在python中使用,各编程语言都会用到。

2.正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。

Python正则表达式_第1张图片
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*?)[^>]>.?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\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[AZ]+  //匹配由26个英文字母的大写组成的字符串
5+     / / 匹 配 由 26 个 英 文 字 母 的 小 写 组 成 的 字 符 串 [ A − Z a − z 0 − 9 ] +   //匹配由26个英文字母的小写组成的字符串 ^[A-Za-z0-9]+   //26[AZaz09]+  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
[\u4e00-\u9fa5] //匹配中文


  1. a-zA-Z ↩︎

  2. 1-9 ↩︎

  3. 1-9 ↩︎

  4. A-Za-z ↩︎

  5. a-z ↩︎

你可能感兴趣的:(Python正则表达式)