['d', 'd', 'a', 'd', 'f', 'a', 'd', 'f', 'a', 'f', 'd', 'a', 'f', 'd', 'a', 'd', 'f', 'a', 's', 'f', 'd', 'a', 'f', 'a', 'f', 'd', 'a'] (1) ['1', '2', '3', '2', '4', '6', '4', '6', '5', '1', '6', '4', '8', '1', '5', '6', '4', '1', '2', '7', '1', '1', '3', '0', '0', '2', '5', '8'] (2) [] (3)
上面代码运行结果(1)处匹配了所有的字符串,单个匹配;(2)处匹配了字符串中的数字,返回到一个列表中;(3)处匹配不存在的情况,返回一个空列表。
重点:(1)匹配不到的时候返回一个空的列表;(2)如果没有指定匹配次数,则只单个匹配。
(8)finditer(pattern,string,flags=0)
def finditer(pattern, string, flags=0): """Return an iterator over all non-overlapping matches in the string. For each match, the iterator returns a match object. Empty matches are included in the result.""" return _compile(pattern, flags).finditer(string) finditer(pattern,string)查找模式,Return an iterator over all non-overlapping matches in the string.For each match,the iterator a match object.
代码如下:
import re string = "dd12a32d46465fad1648fa1564fda127fd11ad30fa02sfd58afafda" m = re.finditer("[a-z]",string) print(m) n = re.finditer("AB",string) print(n)
运行结果如下:
<callable_iterator object at 0x7fa126441898> (1) <callable_iterator object at 0x7fa124d6b710> (2)
从上面运行结果可以看出,finditer(pattern,string,flags=0)返回的是一个iterator对象。
(9)compile(pattern,flags=0)
def compile(pattern, flags=0): "Compile a regular expression pattern, returning a pattern object." return _compile(pattern, flags)
(10)pruge()
def purge(): "Clear the regular expression caches" _cache.clear() _cache_repl.clear()
(11)template(pattern,flags=0)
def template(pattern, flags=0): "Compile a template pattern, returning a pattern object" return _compile(pattern, flags|T)
正则表达式:
语法:
import re string = "dd12a32d46465fad1648fa1564fda127fd11ad30fa02sfd58afafda" p = re.compile("[a-z]+") #先使用compile(pattern)进行编译 m = p.match(string) #然后进行匹配 print(m.group())
上面的第2 和第3行也可以合并成一行来写:
m = p.match("^[0-9]",'14534Abc')
效果是一样的,区别在于,第一种方式是提前对要匹配的格式进行了编译(对匹配公式进行解析),这样再去匹配的时候就不用在编译匹配的格式,第2种简写是每次匹配的时候都要进行一次匹配公式的编译,所以,如果你需要从一个5w行的文件中匹配出所有以数字开头的行,建议先把正则公式进行编译再匹配,这样速度会快点。
匹配的格式:
(1)^ 匹配字符串的开头
import re string = "dd12a32d41648f27fd11a0sfdda" #^匹配字符串的开头,现在我们使用search()来匹配以数字开始的 m = re.search("^[0-9]",string) #匹配字符串开头以数字开始 (1) print(m) n = re.search("^[a-z]+",string) #匹配字符串开头以字母开始,如果是从开头匹配,就与search()没有太多的区别了 (2) print(n.group())
运行结果如下:
None
dd
在上面(1)处我们使用^从字符串开头开始匹配,匹配开始是否是数字,由于字符串前面是字母,不是数字,所以匹配失败,返回None;(2)处我们以字母开始匹配,由于开头是字母,匹配正确,返回正确的结果;这样看,其实^类似于match()从开头开始匹配。
(2)$ 匹配字符串的末尾
import re string = "15111252598" #^匹配字符串的开头,现在我们使用search()来匹配以数字开始的 m = re.match("^[0-9]{11}$",string) print(m.group())
运行结果如下:
15111252598
re.match("^[0-9]{11}$",string)含义是匹配以数字开头,长度为11,结尾为数字的格式;
(3)点(·) 匹配任意字符,除了换行符。当re.DoTALL标记被指定时,则可以匹配包括换行符的任意字符