今天学习到python中的正则表达式,符号太多了有点混乱,就写博客留着使用
python3.x可以匹配汉字而2.x不行
.
默认匹配一个字符,不包含换行符,如果设置DOTALL则匹配换行符
1.
我们已经了解了正则表达式中的一些特殊符号,如\b、\d、.、\S等等。这些具有特殊意义的专用字符被称作“元字符”。常用的元字符还有:
\w - 匹配字母或数字或下划线或汉字(我试验下了,发现3.x版本可以匹配汉字,但2.x版本不可以)
\s - 匹配任意的空白符
^ - 匹配字符串的开始
$ - 匹配字符串的结束,匹配行尾
2.
\S其实就是\s的反义,任意不是空白符的字符。同理,还有:
\W - 匹配任意不是字母,数字,下划线,汉字的字符
\D - 匹配任意非数字的字符
\B - 匹配不是单词开头或结束的位置
[a]的反义是[^a],表示除a以外的任意字符。[^abcd]就是除abcd以外的任意字符。
3.
之前我们用过*、+、{}来表示字符的重复。其他重复的方式还有:
? - 重复零次或一次
{n,} - 重复n次或更多次
{n,m} - 重复n到m次
正则表达式不只是用来从一大段文字中抓取信息,很多时候也被用来判断输入的文本是否符合规范,或进行分类。来点例子看看:
^\w{4,12}$
这个表示一段4到12位的字符,包括字母或数字或下划线或汉字,可以用来作为用户注册时检测用户名的规则。(但汉字在 python2.x里面可能会有问题)
\d{15,18}
表示15到18位的数字,可以用来检测身份证号码
^1\d*x?
以1开头的一串数字,数字结尾有字母x,也可以没有。有的话就带上x。
转义字符\。如果我们确实要匹配.或者*字符本身,而不是要它们所代表的元字符,那就需要用\.或\*。\本身也需要用\\。
比如"\d+\.\d+"可以匹配出123.456这样的结果。
*
匹配0个或者多个重复
+
匹配一个或者多个重复
?
匹配一个或者零个重复
*?,+?,??
按照非贪婪模式匹配
{m},{m,n},{m,n}?
分别匹配m个重复,m至n个重复,m至n个重复按照非贪婪模式
\
转义
[]
[abc],[a-z][^a-z]
|
或者匹配 'a|b'
(...)
匹配组
1
2
3
4
5
6
7
8
9
10
|
(?iLmsux)
(?:...) (?P<name>...)
>>> re.match(
'(?P<name>abc){2}'
,
'abcabc'
).groupdict()
{
'name'
:
'abc'
}
(?P
=
name)
>>> re.match(r
'(?P<name>abc)----(?P=name)'
,
'abc----abc'
).group()
'abc----abc'
(?
#...) #后面的内容为注释
(?
=
...)
|
匹配的字符串后面的内容需要匹配
1
2
3
4
|
>>> re.match(r
'phone(?=\d{3})'
,
'phone123'
).group()
'phone'
#
(?!...)
|
匹配的字符后面内容不能匹配
1
2
3
|
>>> re.match(r
'phone(?!\d{3})'
,
'phoneabc123'
).group()
'phone'
(?<
=
...)
|
匹配的字符串前面需要匹配
(?<!...) 匹配的字符前面不能匹配
(?(id/name)yes-pattern|no-pattern)
\number
\A 匹配字符串的开头
\b 匹配单词边界
\B
\b的反义
\d 表示[0-9]
\D表示 [^0-9]
\s表示 [ \t\r\n\f\v]
\S 为非空白字符
\w等价于 [a-zA-Z0-9]
\W \w的反义
\Z 匹配字符串的结束