正则表达式
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。
推荐学习30分钟入门教程(ps:当然你可能不止花费30分钟-):http://deerchao.net/tutorials/regex/regex.htm
Python堆正则表达式的支持:
compile
compile(pattern, flags=0)
编译正则表达式返回正则表达式对象
match
match(pattern, string, flags=0)
用正则表达式匹配字符串,匹配成功返回匹配对象,否则返回None。从第一个字符开始匹配。
search
search(pattern, string, flags=0)
搜索字符串中第一次出现正则表达式的模式,匹配成功返回匹配对象,否则返回None,可以从任意位置开始匹配。
findall 和 finditer
findall(pattern, string, flags=0)
查找字符串所有与正则表达式匹配的模式,并返回一个列表。
finditer(pattern, string, flags=0)
查找字符串所有与正则表达式匹配的模式,并且返回一个迭代器。span返回匹配的位置,group返回匹配的内容。
下面这个实例是查找出字符串中所有的电话号码,用findall 和 finditer 两种方式查找
import re
def phone_num():
patter1 = re.compile(r'(?<=\D)1[345789]\d{9}(?=\D)')
sentence = '重要的事情说8130087690870遍,我的手机号是13567672929,不是13789890976!'
# 找出所有匹配的内容 返回一个列表
my_list = patter1.findall(sentence)
print(my_list)
# iter - iterator 迭代器
for temp in patter1.finditer(sentence):
print(temp)
print(temp.span())
print(temp.group())
if __name__ == '__main__':
phone_num()
sub
sub(pattern, repl, string, count=0, flags=0)
用指定的字符串替换原字符串中与正则表达式匹配的模式,
patter需要替换的字符,repl用作替换的内容,string指定的字符串,count指定替换的次数,flags设置是否忽略大小写。
import re
def main():
sentence = '马化腾傻逼操你大爷fuck你'
# 内容替换
# 正则表达式 替换符 替换的内容 是否忽略大小写
pure = re.sub('[操草艹]|傻逼|fuck|马化腾', '*', sentence, flags=re.IGNORECASE)
print(pure)
if __name__ == '__main__':
main()
注意:替换符可以是字符/字符串/可调用的函数,下面这个例子的替换内容就是一个函数。
from re import sub
def foo(mo):
# mo - 匹配对象
# group返回匹配的对象,传入参数foo1,这是一个组名,返回此组的匹配的内容
# mo.group('foo1') - 返回名称为foo1组里的文本
value = int(mo.group('foo1'))
return str(value ** 2)
def main():
sentence = 'fgkfshf12hdjsh876hdf962hf'
# (?P<foo1>\d+) 匹配一个或多个数字,并捕获文本到名称为foo1的组里
# 注意:Python中必须加上P
print(sub(r'(?P<foo1>\d+)', foo, sentence))
if __name__ == '__main__':
main()
运行结果:字符串中所有的数字都被替换成了其平方
fgkfshf144hdjsh767376hdf925444hf
split
split(pattern, string, maxsplit=0, flags=0)
patter拆分依据,string指定的字符串,flags设置是否忽略大小写。
def main():
sentence1 = 'you go your way, i will go home!'
# 按照空白符字符拆分
mylist = re.split(r'[ ,!]', sentence1)
print(mylist)
if __name__ == '__main__':
main()