Python学习记录
1.正则-> WHY, WHAT, HOW
WHY:
从大量文本中查找规则字符串,比字符串各种查找都快,利用c语言的匹配引擎,广泛用于各种搜索,查找,爬虫
what:
正则-> 代数,变量替换(用一些规定好的符号去匹配有规则的文本)
语法说明:
表 1. 正则表达式语法
符号
意义
例子
.
表示任意字符,如果说指定了 DOTALL 的标识,就表示包括新行在内的所有字符。
^
表示字符串开头。
’只能匹配‘ test ’。
, +, ?
''表示后面可跟 0 个或多个字符,'+'表示后面可跟 1 个或多个字符,'?'表示后面可跟 0 个或多个字符
‘ abc* ’可以匹配‘ abc ’ 或者‘ abcd ’或者‘ abcdefg ’等等。
?, +?, ??
在上面的结果中只取第一个
<> 会匹配'<H1>title</H1>'整个字符串(贪婪匹配),使用
串(贪婪匹配),使用 ? 可以只找出 <H1>(非贪婪匹配)
{m}
对于前一个字符重复 m 次
a{6} 匹配 6 个'a'
{m,n}
对于前一个字符重复 m 到 n 次
a{2,4} 匹配 2-4 个 a,a{2,} 匹配 2 个以上 a,a{,4} 匹配 4 个以下 a
{m,n}?
对于前一个字符重复 m 到 n 次,并且取尽可能少的情况
在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2,4}? 只匹配 2 个 a
对特殊字符进行转义,或者是指定特殊序列
[]
表示一个字符集
[abc] 会匹配字符 a,b 或者 c,[a-z] 匹配所有小写字母,[a-zA-Z0-9] 匹配所有字母和数字,[^6] 表示除了 6 以外的任意字符
|
或者,只匹配其中一个表达式
A|B,如果 A 匹配了,则不再查找 B,反之亦然
( … )
匹配括号中的任意正则表达式
(?#...)
注释,忽略括号内的内容
(?= … )
表达式’…’之前的字符串
在字符串’ pythonretest ’中 (?=test) 会匹配’ pythonre ’
(?!...)
后面不跟表达式’…’的字符串
如果’ pythonre ’后面不是字符串’ test ’,那么 (?!test) 会匹配’ pythonre ’
(?<= … )
跟在表达式’…’后面的字符串符合括号之后的正则表达式
正则表达式’ (?<=abc)def ’会在’ abcdef ’中匹配’ def ’
(?<!...)
括号之后的正则表达式不跟在’…’的后面
(?aiLmsux)
(使用一个或多个字符'a','i','L','m','s','u','x'.)分别对应这些正则标志符号:
re.A(ASCII-only matching),
re.I(ignore matching),
re.I(ignore case),
re.L(locale dependent),
re.M(multi-line),
re.S(dot matches all),
re.U(Unicode matching),
andre.X(verbose)
(?:...)
正则括号的非捕获版本. 匹配括号内的任何正则表达式, 但是组里匹配的子字符串在执行了匹配或者被之后的规则引用后将不能被获取
(?imsx-imsx:...)
(使用零个或多个字符'i','m','s','x', '-'可选) 表示设置或去除相应的标志符号:re.I(ignore case),
re.M(multi-line),re.S(dot matches all), and re.X(verbose), for the part of the expression. (The flags are described inModule Contents.)
New in version 3.6.
(?P<name>...)
和用括号的正则类似,但是name可以关联匹配到的字符串,作为分组名称
(?P<quote>['"]).?(?P=quote)(匹配单引号或双引号的字符串):
(?P=name)
与上面命名的用法连用,用来代指匹配到的字符串
(?(id/name)yes-pattern|no-pattern)
如果给定的组id或name存在,就通过yes-pattern去匹配,否则通过no-pattern匹配
no-pattern是可选的,可以去掉.
(<)?(\w+@\w+(?:.\w+)+)(?(1)>|$)匹配'user@host.com'和'user@host.com',
但不能匹配'<user@host.com'或'user@host.com>'.
[01]?:表示可以是空或0或1
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
reg = re.compile(r'''
(((2[0-4]\d|25[0-5]|[01]?\d\d?).) # ip的第一组数字,包括.
{3} # 表示三组数字
(2[0-4]\d|25[0-5]|[01]?\d\d?) # 最后一组数字
''',re.X) #正则可以换行,可以注释
match = reg.match('192.168.1.1')
print(match.group())
正则匹配可以直接换掉内容吗?
手机号,电话号:
手机号码傻瓜版: ^1\d{10}
验证Email地址:/.+@.+.[a-z]+/
身份证:
身份证号: ^(\d{15}|\d{17}(\d|X))$
2.6.6. 案例:找找她的联系方式
字符大小写
-长度限制
-数字范围
-手机
-邮箱
-用户名或密码的一些潜规则
匹配腾讯QQ号:[1-9][0-9]{4,}腾讯QQ号从10000开始
-只能输入汉字:^[\u4e00-\u9fa5]{1,8}”
-验证用户密码:“^[a-zA-Z]\w{7,17}$”正确格式为:以字母开头,长度在8-18之间,只能包含字符、数字和下划线。
常用正则表达式
-只能输入汉字:^[\u4e00-\u9fa5]{1,8}”
-验证用户密码:“^[a-zA-Z]\w{7,17}$”正确格式为:以字母开头,长度在8-18之间,只能包含字符、数字和下划线。
网友评论