正则表达式

2018-04-09  本文已影响0人  kris_lp

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
很可能你使用过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()
上一篇下一篇

猜你喜欢

热点阅读