正则表达式
一、边界匹配
- '^' : 匹配开头如 '^\d' 必须以数字开头才能匹配到。"3siwu"
- '$' : 匹配结尾如 '[a-z]$' 只能匹配到小写字母结尾的字符串。 "3423Az"
-
'\A' 只从字符开头匹配,re.search("\Aabc","Aabc") 是匹配不到的。同 ^
-
'\Z' 匹配字符结尾,同$
-
"\b" :不会消耗任何字符只匹配一个位置,常用于匹配单词边界 如 我想从字符串中"This is Regex"匹配单独的单词 "is" 正则就要写成 "\bis\b"
\b 不会匹配is 两边的字符,但它会识别is 两边是否为单词的边界
- "\B" 匹配不是单词开头或结束的位置
二、一般字符
- '.' 点匹配除\n之外的任意一个字符,(python re模块中,若指定flag DOTALL,则匹配任意字符,包括换行)
- '\': 转义字符,改变后一个字符代表的意思,如'\AA' 就是只能匹配大写A开头。同理只有这样才能匹配到斜杠 '\'
- '[]': 中括号,表示匹配里面里面任意一个字符。如果[^abcd] 以^开头表示取反,匹配除了abcd以外的任意字符。[0-9a-zA-Z] 表示匹配0到9和a到z及A到Z
三、已被定义了的字符
- "\d": 匹配数字,'sjgk8jge' 使用 'd' 就可以匹配出里面的数字8。'\d' 范围为[0-9]
- "\D" :匹配非数字,字母或者特殊字符都能匹配
- "\w":匹配[A-Za-z0-9]
- '\W' 匹配非[A-Za-z0-9]
四、放在字符后表示匹配数量
- '*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
- '+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
- '?' 匹配前一个字符1次或0次
- '{m}' 匹配前一个字符m次
- '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
五、逻辑分组
- '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
- '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
六、好用的升级版分组匹配
"(exp)" 匹配exp,并捕获文本到自动命名的组里
"(?
"(?:exp)" 匹配exp,不捕获匹配的文本,也不给此分组分配组号
以下为零宽断言
"(?=exp)" 匹配exp前面的位置
如 "How are you doing" 正则"(?
"(?<=exp)" 匹配exp后面的位置
如 "How are you doing" 正则"(?
"(?!exp)" 匹配后面跟的不是exp的位置
如 "123abc" 正则 "\d{3}(?!\d)"匹配3位数字后非数字的结果
"(?<!exp)" 匹配前面不是exp的位置
如 "abc123 " 正则 "(?<![0-9])123" 匹配"123"前面是非数字的结果也可写成"(?!<\d)123"
人生还有意义。那一定是还在找存在的理由