No.25
今日概要
- 正则表达式
内容详细
正则表达式
- 为什么要有正则表达式?
- 一个人的电话号码
- 一个人的身份找号
- 一台机器IP地址
- 表单验证
- 验证用户输入信息是否准确
- 银行卡号
- 爬虫
- 从网页源码中获取链接或重要数据
1规则
- 规则一:本身是哪一个字符,就匹配字符串中的哪一个字符。
- 规则二:字符组 [字符1,字符2],一个字符组就代表匹配一个字符,只要这个字符出现在字符组里,那么就说明这个字符能匹配上。
- 字符组中还可以使用范围 [A - Z] \ [0 - 9]
- 所有的范围都必须遵循ascii码从小到大来指定
2元字符
- [0 - 9] → \d
- \ 是转义符,转义符转义了d,让d能匹配所有0-9之间的数字。
- [\d] [0-9] \d 三者没有区别都是匹配一位数字。
- \w
- 匹配所有数字、字母、下划线
- \s
- 匹配空白(空格、换行符、制表符)
- [\d\D] [\w\W] [\s\S] 匹配所有一切字符,没有多大意义。
- \t
- 匹配制表符
- \n
- 匹配换行符
- \D
- 匹配所有非数字
- \W
- 匹配除数字、字母、下划线之外的所有字符
- \S
- 匹配除空白之外的所有字符
- .
- 匹配除了换行符之外的所有字符
- [ ]
- 字符组:只要在中括号内的所有字符都是符合规则的字符。
- [^]
- 非字符组:只要在中括号内的所有字符都是不符合规则的字符。
- ^
- 表示一个字符的开始
- $
- 表示一个字符的结束
- |
- 表示或,如果两个规则有重叠部分,总是长的在前面短的在后面。
- ()
- 表示分组,给一部分正则规定为一组,
- ( | ) 分组配合或使用,或的作用域就可以缩小了。
- 记忆顺序
- \d (digit) \w (word) \s(space) \t (table) \n (next)
- \D \W \S
- .
- [ ] [ ^ ]
- ^ $
- | ( )
3量词
-
{n} 表示只能出现n次
-
{n,} 表示至少出现n次
-
{n,m} 表示至少出现n次,至多出现m次
-
? 表示匹配0次或1次
- 可有可无,但是有只能有1个,比如小数点。
-
+ 表示匹配1次或多次
-
* 表示匹配0次或多次
- 可有可无,但是有可以有多个,比如小数点后n位
#习题 '1.匹配任意的两位整数' \d{2} '2.匹配保留两位小数的任意数字' \d+\.\d{2} '3.匹配一个整数或者小数' \d+\.\d+|\d+ \d+(\.\d+)?
-
注意
-
贪婪匹配:总是在符合量词条件的范围内尽量多匹配。
# 默认贪婪匹配(回溯算发实现) \d{6,12} 12345678 # 量词范围条件内尽量取多的次数匹配 结果:全部匹配 <.+> <html>abcdefghijk</htlm> # 只会匹配到一个结果 结果:全部匹配
-
惰性匹配:总是匹配符合条件范围内尽量小的字符串。
# 非贪婪匹配 \d{6,12}? 12345678 结果:123456 # 只匹配条件类最小的次数。 \d+?3 12345678 结果:123
-
元字符+量词+?:表示按照元字符规则在量词范围内匹配,一旦遇到x就停止。
\d+?3 12345678 结果:123
-
.*?x:表示匹配任意的内容任意多次遇到x就停止。
-
常用写法:
- 元字符或普通字符
- 元字符量词
- 元字符量词?
- \d?:如果?直接出现在元字符后,就只表示量词不表示非贪婪符。
- ?要表示非贪婪符一般是跟在量词后面。
- d+?x / .*?x
- 一般情况下+?x / *?x 前面放正则表达式来进行匹配
4实例
# 身份证号正则表达式
'''
15位:全数字,首位不为0。
18位:全数字,首位不位0,最后一个可能是x和数字。
'''
[1-9](\d{16}[\dx]|\d{14})
[1-9]\d{14}(\d{2}[\dx])?
作业
- 元字符
- 量词
- 贪婪匹配和非贪婪匹配