美文网首页
正则表达式

正则表达式

作者: StephenZhang01 | 来源:发表于2018-09-09 17:25 被阅读0次

    正则表达式符号(元字符)

    '.':通配符。默认匹配除了'\n'以外的任意一个字符(包括字母、符号与数字)。若指定flag DOTALL,则匹配任意字符包括换行。

    '^':匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)

    '$':匹配字符结尾。

    '[]':匹配中括号中的一个字符

    '?':匹配前一个字符0或1次

    '*':匹配*号前的字符0次或多次

    '+':匹配+号前一个字符1次或多次

    '{m}':匹配前一个字符m次

    '{m,n}':匹配前一个字符m到n次

    '|':匹配|左或|右的字符

    '(exp)':分组匹配, 括号内就是一个分组,组号从1开始。\1

    '(?:exp)':取消括号内分组,没有分组号。

    '\A':只从字符开头匹配

    '\Z':匹配字符结尾。

    '\d':匹配数字0-9

    '\D':匹配非数字

    '\w':只匹配[A-Za-z0-9]

    '\W':只匹配非[A-Za-z0-9]

    '\s':匹配空白字符、\t、\n、\r

    '\b':捕捉与特殊字符之间的边界,如re.findall(r'a\b', 'a$')

    '*?,+?,??':则是取消贪婪模式,尽量匹配最少的。例如re.findall('<.*?>', 'sdfs')

    '(?P<name>exp)':分组匹配,并将<>内的内容作为key,然后与匹配项组成字典,通过key取得匹配的内容。例:a = re.search("(?P[0-9]+)(?P[a-zA-Z]+)",'sdf33232sdf')    a.group('id', 'name')

    '(?=exp)':正预测先行断言:表示匹配项后必须是满足exp条件。注意:断言不是分组,所以没有分组号。例:d = "wood boost foo "; re.findall("f(?=ood)", d)

    '(?<=exp)':正回顾后发断言:表示匹配项前需要满足exp条件。例:d = "wood boost foo "; re.findall("(?<=w)ood", d)

    '(?!exp)':负预测先行断言。表示匹配项后必须不是exp条件。例:d = "123456 "; re.findall("\d{3}(?!\d)", d)


    匹配字符串的常用方法

    match方法

    从头至尾匹配字符,匹配严格

    re.match(a,b)

    a参数为匹配条件(正则表达式符号);b参数为要匹配字符串

    re.match('dsf\d+','dsf1221sdf')

    search方法

    从头到尾匹配一次,只要匹配到就返回。

    re.search(a,b)

    a参数为匹配条件(正则表达式符号);b参数为要匹配字符串

    例:

    a = re.search('\d','sdf123dser')

    print(a.group())

    findall方法

    匹配多次,直到找到所有匹配。并以列表输出。

    urls2 = '''https://www.jianshu.com

    https://www.baidu.com'''

    data3 = re.findall("^(?:http|https).*", urls2, flags=re.M)

    print("3: \033[31;1m{}\033[0m\n".format(data3))

    finditer方法

    返回迭代器,且里面的元素为match对象。使用循环遍历或next取出元素(惰性求值),然后对元素用groups,取分组。

    compile方法

    words = "Hello world "

    cp = re.compile("[a-z]+")

    cp.search(words, 2,10)  # 限定匹配区间

    split方法

    匹配并分割

    re.split('分隔字符/规则','分割对象')

    例re.split('e','sdfesdfe223')

    sub方法

    匹配并替换

    re.sub("匹配内容","替换内容","匹配对象",count=N)

    N为从开头到结尾匹配次数

    re.sub('[0-9]+',' ','sdf234dsf34csdfs234sdf',count=1)

    subn方法

    匹配并替换,最后返回结果与替换次数

    re.subn("匹配内容","替换内容","匹配对象",count=N)


    flags参数(模式修正符)

    re.I:忽略大小写

    例:re.search('[a-z]+','sdfASDSAfgds',flags=re.I)

    re.M:多行匹配。如果有托字符^或$,则影响每行(行首、行尾)。

    re.L:本地化识别匹配。

    re.U:根据unicode字符来解析。

    re.S:单行匹配:使'.'可以匹配换行符:


    贪婪模式与懒惰模式

    常规贪婪模式

    匹配任意多个字符:.*

    懒惰模式

    最少匹配任意字符:.*?

    例:

    a = 'a.*b'

    b = 'a.*?b'

    c = 'asdf12321bc*^%$b'

    re.search(a, c)

    re.search(b, c)

    相关文章

      网友评论

          本文标题:正则表达式

          本文链接:https://www.haomeiwen.com/subject/qlldgftx.html