Python—正则表达式
***正则表达式***为高级人文本模式匹配、抽取、文本形式的搜索和替换功能提供了基础。简单地说,**正则表达式(regex)**是一些由字符和特殊特号组成的字符串,它们描述了模式的重复或者表述多个字符,于是正则表达 式能按照某种模式匹配一系列有相似特征的字符串。
re
在python中需要通过正则表达式对字符串进行匹配的时候 ,可以使用一个模拟,名字为re,re模块在古老的python1.5版中引入,用于替换那些已经过时regex模块和regsub模块——这两个模块在python2.5版中移除,而且此后导入这两个模块中的任意一个都会触发ImportError异常
re模块支持更强大的而且更通用的Perl风格的正则表达试,该模块允许多个线程共享一个已编译的正则表达式对象,也支持命名子组
#导入re模块
import re
#使用match方法进行匹配 match能够匹配以xx开关的字符串
result = re.match(正则表达式,要匹配的字符串)
#如果上一步匹配到数据的话,可以使用group方法来提取灵气
result.group()
示例
>>> import re
>>> result = re.match("hello","hello world")
>>> result.group()
'hello'
-
匹配单个字符
字符 功能 .
匹配任意1个字符 (除了\n) []
匹配[]中列举的字符 \d
匹配数字,即0-9 \D
匹配非数字,即不是数字 \s
匹配空白 ,即空格,tab键 \S
匹配非空白 \w
匹配单词字符,即a-z 、A-Z 、0-9 、_ \W
匹配非单词字符 #案例1 import re result = re.match(".o","to").group() print(result) #结果 to #案例2 大小写都可以写的情况 result = re.match("[hH]ello","HelloWorld") print(result.group()) #结果 Hello result = re.match("[hH]ello","helloWorld") print(result.group()) #结果 hello #案例3 ret = re.match("嫦娥\d号","嫦娥1号发射成功") print(ret.group()) #结果 嫦娥1号 ret = re.match("嫦娥\d号","嫦娥2号发射成功") print(ret.group()) #结果 嫦娥2号 ret = re.match("嫦娥\d号","嫦娥3号发射成功") print(ret.group()) #结果 嫦娥2号 案例 ret = re.match("pytho\w","python").group() print(ret) #结果 python
-
匹配多个字符
字符 功能 *
匹配前一个字符出现0次或者无限次 +
匹配前一个字符出现1次或者无限次 ?
匹配前一个字符出现1次或者0次,即要么有1次,要么没有 {m}
匹配前一个字符出现m次 {m,n}
匹配前一个字符出现从m到n次 #案例 >>>import re >>> ret = re.match("[A-Z][a-z]*","M") >>> print(ret.group()) M >>> >>> ret = re.match("[A-Z][a-z]*","MnnM") >>> print(ret.group()) Mnn >>> >>> ret = re.match("[A-Z][a-z]*","Aabcdef") >>> print(ret.group()) Aabcdef >>> #案例 >>> names = ["name1", "_name", "2_name", "__name__"] >>> for name in names: ... ret = re.match("[a-zA-Z_]+[\w]*",name) ... if ret: ... print("变量名 %s 符合要求" % ret.group()) ... else: ... print("变量名 %s 非法" % name) ... 变量名 name1 符合要求 变量名 _name 符合要求 变量名 2_name 非法 变量名 __name__ 符合要求 #案例 >>> ret = re.match("[1-9]?[0-9]","7") >>> print(ret.group()) 7 >>> >>> ret = re.match("[1-9]?\d","33") >>> print(ret.group()) 33 >>> >>> ret = re.match("[1-9]?\d","09") >>> print(ret.group()) 0 #案例 >>> ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678") >>> print(ret.group()) 12a3g4 >>> >>> ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66") >>> print(ret.group()) 1ad12f23s34455ff66 >>>
-
匹配开头结尾
字符 功能 ^ 匹配字符串开头 $ 匹配字符串结尾 >>> email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei",".com.xiaowang@qq.com"] >>> >>> for email in email_list: ... ret = re.match("[\w]{4,20}@163\.com$", email) ... if ret: ... print("%s 是符合规定的邮件地址,匹配后的结果是:%s" % (email, ret.group())) ... else: ... print("%s 不符合要求" % email) ... xiaoWang@163.com 是符合规定的邮件地址,匹配后的结果是:xiaoWang@163.com xiaoWang@163.comheihei 不符合要求 .com.xiaowang@qq.com 不符合要求 >>>
-
匹配分组
字符 功能 |
匹配左右任意一个表达式 (ab)
将括号中字符作为一个分组 \num
应用分组num匹配到的字符串 (?p<name)
分组别名 (?P=name)
引用别名为name分组匹配到的字符串 #案例 >>> import re >>> >>> ret = re.match("\w{4,20}@163\.com", "test@163.com") >>> print(ret.group()) test@163.com >>> >>> ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@126.com") >>> print(ret.group()) test@126.com >>> >>> ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@qq.com") >>> print(ret.group()) test@qq.com >>> >>> ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@gmail.com") >>> if ret: ... print(ret.group()) ... else: ... print("不是163、126、qq邮箱") # 不是163、126、qq邮箱 ... 不是163、126、qq邮箱 >>> #案例 >>> test_label = "<html>hh</htmlbalabala>" >>> ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", test_label) >>> if ret: ... print(ret.group()) ... else: ... print("%s 这是一对不正确的标签" % test_label) ... <html>hh</htmlbalabala> 这是一对不正确的标签 >>> #案例 >>> labels = ["<html><h1>www.ccitboy.cn</h1></html>", "<html><h1>www.ccitboy.cn</h2></html>"] >>> >>> for label in labels: ... ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label) ... if ret: ... print("%s 是符合要求的标签" % ret.group()) ... else: ... print("%s 不符合要求" % label) ... <html><h1>www.ccitboy.cn</h1></html> 是符合要求的标签 <html><h1>www.ccitboy.cn</h2></html> 不符合要求 #案例 P大写 >>> ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.ccitboy.cn</h1></html>") >>> ret.group() '<html><h1>www.ccitboy.cn</h1></html>' >>>
search
search()的工作方式与match()完全一致,不同之处在于search()会用到字符串参数,在任意位置对给定正则表达式模式搜索第一次出现的匹配情况。如果搜索到成功的匹配,就会返回一个匹配的对象;否则,返回None
>>> import re
>>> ret = re.search("bit","hello bit me!!")
>>> print(ret.group())
bit
>>>
>>> ret = re.search("bit","hello ss me!!")
>>> print(ret)
None
>>>
findall
findall()查询字符串中某个正则表达式模式 全部非重复出现的情况,这与search()在执行字符串搜索时类似 ,但与match()和search()的不同之处在于,findall()总是返回一个列表,如果 findall()没有找到匹配的部分,就返回一个空列表,但如果匹配成功,列表将包含所有匹配成功部分
>>> re.findall('car','carry the barcardi to the car')
['car', 'car', 'car']