正则表达式基础
1.正则表达式只和字符串相关
2.用中括号表示,在同一个位置上只能出现一个符合的字符
—— 字符组
3.按照ascii码来匹配的,只能从小到大。#[A-z] 这可以,但是不建议,因为中间还有一些别的字符
#第一大块——匹配一个字符
# . 匹配除换行符之外的所有字符 # \w 匹配所有字母数字下划线 word # \s 任意空白符 space # \d 数字 digit # \W 匹配非word # \S 匹配非space # \D 匹配非digit #任意两个大小写一起,就是全局 [\D\d]
# ^ 匹配字符串的开始 示例 ^[a-z] 以小写字母开始 # 出现在[]内,比如[^a-z],除了a-z之外的都匹配 # $ 匹配字符串的结尾 # ^[a-z]$ 只能有一个字符,也就是中间的字符组有几个,就匹配几个字符,形成闭合
# | 或 示例:a|b,且从左向右,能够匹配左边就不会匹配右边了,所有建议长的放左边 # \n换行 \t制表符 # \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.\n \t
4.\b
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就停