Python 正则表达式

悄悄问圣僧,女儿美不美

  好久没有更新文章啦,主要是实在不知道写点啥。最近忙着搞安全开发,很多知识的学习都暂时停滞了,因此也没啥新知识可以分享的。想起之前一直有人问我怎么写正则表达式,我就在本篇结合Python语言,总结下正则表达式到底该怎么写吧。

正则规则

想要写好正则表达式,就先学习下它的规则吧!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[]:指定一个字符集,'[abc\s\d]'中,a,b,c任意一个满足便可以。
{}:重复,a{8}=aaaaaaaa;b{1,3}:重复1-3次。
^:匹配行首,'[^abc]'中,除了a,b,c,其他的都可以;'^hello'表示行首是hello的字符串。
$:匹配行尾,'boy$'表示行尾是boy的字符串。
\:转义字符
\d:[0-9]
\w:[a-zA-Z0-9_]
\s:空格或者tab或者换行,也包括\r\n
*:指定前一个字符匹配0次或多次。'ab*',可以匹配a,ab,abb,abbbb等。
+:指定前一个字符匹配1次或多次。
?:指定前一个字符匹配0次或1次,加载重复后面可以最小匹配。
.:表示任意字符(换行符\n除外re.DOTALL可以匹配所有字符串,包括换行;re.compile(r".*",re.DOTALL)
(?i):在正则表达式前面加上这个,便可以忽略大小写;如:res=r"(?i)[abc]"
(asp|php|jsp):表示或者,跟[abc]的区别在于它是匹配一个字符串,而[]只是单个字符。
r'((?[\d]*){2,3})':在内括号前加上?:,结果只匹配外面括号的内容。

Python中使用正则

我们知道正则并不是python特有的,很多编程语言都有正则。而在Python中想要使用正则,需要借助re模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 导入模块
import re
res=r"[\d]{2}" #正则表达式
content="abcd12345678abcd" #待匹配的内容
# 直接匹配
a=re.search(res,content)
if a:
print a.group()
# 编译 (加快匹配速度)
p_tel=re.compile(res) 将正则表达式编译,提高运行速度。
p_tel.findall(content) 找到RE匹配的所有子串,并作为列表返回。
p_tel.match(content) 决定RE是否在字符串刚开始的位置匹配。
p_tel.search(content) 扫描字符串,找到这个RE匹配的位置。
p_tel.group(num=0) 返回全部匹配对象。(或指定编号是num的子组)
p_tel.sub(pattern,string) 对正则表达式中所有匹配string的用pattern替换。
p_tel.split(pattern,string) 根据正则表达式pattern中的分隔符把字符string分隔为一个列表。

贪婪模式

需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。
例子:

1
2
>>> re.match(r'^(\d+)(0*)$', '123400').groups()
('123400', '')

说明:由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

1
2
>>> re.match(r'^(\d+?)(0*)$', '123400').groups()
('1234', '00')

正则实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
匹配IP地址的正则表达式 res=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g
匹配空行的正则表达式:res=\n[\s| ]*\r
匹配HTML标记的正则表达式:res=/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:res=(^\s*)|(\s*$)
匹配中文字符的正则表达式: res=[\u4e00-\u9fa5] #python中需要转换为unicode
匹配双字节字符(包括汉字在内):res=[^\x00-\xff]
user_phone=r"((?:13[0-9]|14[579]|15[0-3,5-9]|17[0135678]|18[0-9])\d{8})"
user_name=r""+u"([\u4e00-\u9fa5\·]{2,3})"
user_id_18=r"([1-9]\d{5}(?:1[9,8]\d{2}|20[0,1]\d)(?:0[1-9]|1[0-2])(?:0[1-9]|1[0-9]|2[0-9]|3[0,1])\d{3}[\dxX])"
user_id_15=r"([1-9]\d{7}(?:0[1-9]|1[0-2])(?:0[1-9]|1[0-9]|2[0-9]|3[0,1])\d{2}[\dxX])"
car_id=r""+u"([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1})"
email=r"([a-z_0-9.-]{2,64}@[a-z0-9-]{2,200}\.[a-z]{2,6})"
address=r""+u"([\u4e00-\u9fa5\·]{6,20})"
Python中针对 unicode正则写法:
res=ur"[\u4e00-\u9fa5]"

正则平台

建议在代码中使用正则前,先测试下正则的质量。为了方便使用,我自己写了一个在线工具,需要的可以用用:http://tool.nmask.cn/python_re/

本文标题:Python 正则表达式

文章作者:nMask

发布时间:2017年10月30日 - 19:10

最后更新:2017年10月31日 - 13:10

原始链接:http://thief.one/2017/10/30/1/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

nMask wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!