正则表达式基础

1.正则表达式只和字符串相关
2.用中括号表示,在同一个位置上只能出现一个符合的字符
—— 字符组
3.按照ascii码来匹配的,只能从小到大。#[A-z]  这可以,但是不建议,因为中间还有一些别的字符

#第一大块——匹配一个字符
#  .   匹配除换行符之外的所有字符
#  w  匹配所有字母数字下划线  word
#  s  任意空白符   space
#  d  数字  digit
#  W  匹配非word
#  S  匹配非space
#  D  匹配非digit
#任意两个大小写一起,就是全局  [Dd]
#  ^   匹配字符串的开始   示例  ^[a-z] 以小写字母开始
#      出现在[]内,比如[^a-z],除了a-z之外的都匹配
#  $   匹配字符串的结尾
#      ^[a-z]$   只能有一个字符,也就是中间的字符组有几个,就匹配几个字符,形成闭合
#  |  或  示例:a|b,且从左向右,能够匹配左边就不会匹配右边了,所有建议长的放左边
#  
换行  	制表符
#  匹配单词结尾

  #第二大块——匹配多个字符

  # (量词,必须在表达式后面,只能约束前一个字符组)
#  *  重复0次或多次
# 贪婪匹配,示例:d*
# 则后面更多的数字都会匹配,直到写了非数字。没有也是重复了0次,匹配了1次

#  +  重复1次或多次
# 示例: d+
# 区别在于*多一个0,这个没有的话就是重复了0次,匹配了0次

#  ?  重复0次或1次
# 示例: d?
# 如果两个数,就是匹配3次
#  {n}  重复n次
#  {n,}  重复n次或更多次
#  {n,m}  重复n-m次

  #第三大块 非贪婪匹配、转义

非贪婪匹配,不加问号就是贪婪
在量词后面加?   会能少匹配就少匹配
[^]{1,2}?   仅匹配1个字符
转义
对每一个都要进行转义,或者再前面加r就取消含义,直接按''里面的字符算
前加r就是按照真实意思来——也就是\\d和 r'\d'的效果是一样的,都是匹配“d”字符

  #第四大块  分组和示例

分组:对整体需要用量词约束的就用小括号括起来再约束
([abc][123])+   匹配a1b2c3是匹配一次,得到所有字符


示例一:匹配身份证号(15位纯数字,或者18位,末位可以是x,开头不能是0)^[1-9]d{14}(d{2}[0-9x])?$
    ^([1-9]d{16}[0-9x]|[1-9]d{14})$    先取长后取短

示例二:贪婪匹配与非贪婪匹配的区别<sscript.com>+……<sscript.org>
<.*>   可以匹配<sscript.com>+……<sscript.org>一整行,匹配一次(贪婪匹配)(回溯算法,找最大集合,然后返回)
<.*?>  可以匹配<sscript.com>和<sscript.org>,匹配两次(非贪婪匹配,惰性匹配)(找?后面第一个符合规则的,然后返回)

示例三:中文不定长,但开头字符一样,以和分割
冰山和冰美人和冰河世纪
↑   [^和]+     匹配下冰山 冰美人 冰河世纪
↑   冰[^和]*

示例四:
.*?x   取前面任意长度,但是直到找到x就会返回,前面的都可以匹配到

*#问号的用法

1.作量词,0次或一次

2.用在两次后面,非贪婪匹配

3.正则与python,?:表示非分组优先

总结:

元字符:

  1.w  s  d   W    S    D

  2. .

  3.  

  4.

  5. ^  $

  6.()  分组,对多个字符的量词进行整体约束

    #re模块:分组是有优先的

        #findall

        #split

  7. |  从左到右,匹配到就不匹配了,所有把长的放前面

  8.[^]  除了字符组内的全匹配

量词:

  1. *

  2. +

  3. ?

  4. {n}

  5. {n,}

  6. {n,m}

转义:

  import re

  re.findall(r'\s',r's')

惰性匹配:

  量词后面加?

  .*?abc   一直取,遇到abc就停

原文地址:https://www.cnblogs.com/lowislucifer/p/11294443.html