正则表达式

# 正则表达式

## 查询网址

### http://tool.chinaz.com/tools/regexgenerate

## 概念

### 正则表达式就是记录文本规则的代码

## 常用元字符

### 。

- 匹配除换行符以外的任意字符

  字符串:tool.chinaz.com|888 4AB
  
  正则表达式:。
  
  这个可以匹配到所有字符
  

### \w

- 匹配字母或数字或下划线

  字符串:tool.chinaz.com|888 4AB_
  
  正则表达式:\w
  
  这个可以匹配所有字母数字下划线,。|不能匹配上
  

### \s

- 匹配任意的空白符,包括空格、换行符、制表符

  字符串:
  abc abc abc
  abc
  
  正则:\s
  
  结果:匹配到两个空格和一个换行
  

### \t

- 匹配制表符

### \n

- 匹配换行符

  字符串:
  abc abc abc
  abc
  
  正则:\s
  
  结果:匹配到一个换行符
  

### \d

- 匹配数字

  字符串:
  asffgd2423ghf我hg你f7868www.baidu.comwww.tencent.com
  
  正则:\d
  
  结果:匹配到24237868
  

### \b

- 匹配单词的开始或结束

### ^

- 匹配字符串的开始

### $

- 匹配字符串的结束

  字符串:
  abc abc abc
  abc
  
  正则:c$
  
  结果:
  匹配到第二行那个abc
  

### []

- 只要在中括号内的所有字符都符合规则,可以用范围如:a-z

  字符串: tool.chinaz.com|888 
  
  正则表达式:[ach1-9.|]
  
  这个可以匹配到ach8.|
  

## 常用元字符反义词

### \W

- 匹配任意不是字母,数字,下划线,汉子的字符

  字符串:
  asffgd2423ghf我hg你f7868www.baidu.comwww.tencent.com
  
  正则:\W
  
  结果:匹配到除了,我你.空格
  

### \S

- 匹配任意不是空白的字符,包括空格、换行符、制表符

  字符串:
  abc abc abc
  abc
  
  正则:\S
  
  结果:匹配到所有abc
  

### \D

- 匹配人员非数字的字符

  字符串:
  asffgd2423ghf我hg你f7868www.baidu.comwww.tencent.com
  
  正则:\d
  
  结果:匹配到除了24237868外的所有字符
  

### \B

- 匹配不是单词的开始或结束

### [^X]

- 匹配除了x以外的任意字符

  str = tool.chinaz.com|888 
  
  正则表达式:[^ch8]
  
  这个可以匹配到除了ch8以外的所有字符,这里面也可以用正则表达式 表示如:[^\d],除了数字888外其它都匹配上
  

## 常用限定符

### *

- 重复零次或者更多次

### +

- 重复一次或者更多次

### ?

- 重复零次或者一次

  字符串
  
  12.56
  15.
  
  正则:\w+\.?\d+
  
  结果:
  12.56
  15
  

### {n}

- 重复n次

### {n,}

- 重复n次或者更多次

### {n,m}

- 重复n到m次

### ()

- 表示分组,给一部分正则规定为一组,|这个符号的作用域就可以缩小

### |

- 表示或

### 分组

- 分组命名

    - (?P(组名)正则)

      import re
      s1 = "<h3>wahaha</h3>"
      s2 = "<a>wahaha ya wahaha</a>"
      ret = re.search("<(?P<tag>\w+)>.*?</(?P=tag)>",s2)  #这里用到分组的命名和组引用
      print(ret.group("tag"))   #通过tag取值
      print(ret.group())
      结果:
      a
      <a>wahaha ya wahaha</a>
      

- 引用分组

    - (?P=组名)

## 正则常用例子

### 身份证匹配

#15位  全数字  首位不位0
#18位  前17位全数字,首位不为0,最后以为是x或数字
字符串:
160025798009102775我86002519800910277x发送方式273649587326535
正则1:[1-9]\d{16}(x|\d)|[1-9]\d{14}
正则2:[1-9]\d{14}(\d{3}|\d{2}x)?
正则3:[1-9](\d{16}[\dx]|\d{14})
160025798009102775
86002519800910277x
273649587326535


### 邮编

\d{6}



### ip

(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)



### email

\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}


### 网址

^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+


### 手机号

0?(13|14|15|17|18|19)[0-9]{9}


### 中文

[\u4e00-\u9fa5]


## re

### ret = re.findall("正则表达式","字符串")

- 匹配所有符合规则的项目,以列表的方式返回

  #以列表的方式返回
  import re
  ret = re.findall("\d+","我是1385niyao345")
  print(ret)
  结果:["138","345"]
  
  注意:如果把\d后面的加号去掉返回[“1”,"3","8","3","4","5"]
  
  
  
  

### ret = re.search("正则表达式","字符串")

- 从头到尾从匹配的字符串中取出第一个符合条件的项,以对象方式返回,通过ret.group()取值

  import re
  ret = re.search("\d+","我是1385niyao345")
  if ret:
      print(ret.group())
  结果:1385
  

### ret = re.match("正则表达式","字符串")

- 从头匹配字符串中取出第一个字符是否符合规则,符合返回对象,通过group()取值,否则返回NONE

  import re
  ret = re.match("\d+","45我是1385niyao345")
  print(ret.group())
  
  结果:45      
  
  注意:这里返回的45是字符串,如果字符串最前面45去掉会报错
  

### ret = re.finditer("正则表达式","字符串")

- 返回符合规则的迭代器,每项都是一个对象,通过group()取值,一般用在比较大的数据

  import re
  ret = re.finditer("\d+","45我是1385niyao345"*2000)
  for i in ret:
      print(i.group())
  
  

### ret = re.split("正则表达式","字符串")

- 通过符合正则表达式的字符分割,返回列表,不包含符合正则的字符,如果想包含正则的字符就在正则加分组

  #这里返回的列表中不包括数字
  import re
  ret = re.split("\d+","45我是1385niyao345")
  print(ret)
  结果:['', '我是', 'niyao', '']
  
  
  例2:
  这里返回的列表中包括数字
  
  
  import re
  ret = re.split("(\d+)","45我是1385niyao345")
  print(ret)
  结果:['', '45', '我是', '1385', 'niyao', '345', '']
  

### ret = re.sub("正则表达式","替换字符串的字符","字符串")

- 通过符合表达是的字符替换成指定的字符,后面还可以传入替换的个数

  import re
  ret = re.sub("(\d+)","D","45我是1385niyao345")
  print(ret)
  结果:D我是DniyaoD
  

### ret = re.subn("正则表达式","替换字符串的字符","字符串")

- 通过符合表达是的字符替换成指定的字符,返回替换后的字符串和替换的数量,以元组的方式返回,后面还可以传入要替换的个数

  import re
  ret = re.subn("(\d+)","D","45我是1385niyao345")
  print(ret)
  结果:('D我是DniyaoD', 3)
  

### ret = re.compile()

- 预编译正则表达式,应用多次调用时减少正则编译次数

  #只是预编译,其它用法一样
  import re
  ret = re.compile("\d+")
  result = ret.findall("45我是1385niyao345")
  print(result)
  结果:['45', '1385', '345']
  

*XMind - Trial Version*

posted @ 2021-04-13 22:35  傻老头  阅读(138)  评论(0)    收藏  举报