• 正则表达式入门


    本文的主要参考是Crossin的编程教室【Python 第56课】 正则表达式(2)
    http://bbs.crossincode.com/forum.php?mod=viewthread&tid=609

    正则表达式就是记录文本规则的代码。正则表达式并不是python中特有的功能,它是一种通用的方法。python中的正则表达式库,所做的事情是利用正则表达式来搜索文本。要使用它,你必须会自己用正则表达式来描述文本规则。

    1

    首先说一种最简单的正则表达式,它没有特殊的符号,只有基本的字母或数字。它满足的匹配规则就是完全匹配。例如:有个正则表达式是“hi”,那么它就可以匹配出文本中所有含有hi的字符。

    来看如下的一段文字:

    Hi, I am Shirley Hilton. I am his wife.

    如果我们用“hi”这个正则表达式去匹配这段文字,将会得到两个结果。因为是完全匹配,所以每个结果都是“hi”。这两个“hi”分别来自“Shirley”和“his”。默认情况下正则表达式是严格区分大小写的,所以“Hi”和“Hilton”中的“Hi”被忽略了。

    为了验证正则表达式匹配的结果,你可以用以下这段代码做实验:

     1 import re
     2 
     3 text = "Hi, I am Shirley Hilton. I am his wife."
     4 
     5 m = re.findall(r"hi", text)
     6 
     7 if m:
     8 
     9     print m
    10 
    11 else:
    12 
    13     print 'not match'


    2

    如果我们只想找到“hi”这个单词,而不把包含它的单词也算在内,那就可以使用“hi”这个正则表达式。在以前的字符串处理中,我们已经见过类似“ ”这种特殊字符。在正则表达式中,这种字符更多,以后足以让你眼花缭乱。

    “”在正则表达式中表示单词的开头或结尾,空格、标点、换行都算是单词的分割。而“”自身又不会匹配任何字符,它代表的只是一个位置。所以单词前后的空格标点之类不会出现在结果里。

    在前面那个例子里,“hi”匹配不到任何结果。但“hi”的话就可以匹配到1个“hi”,出自“his”。

    3.

    最后再说一下[]这个符号。在正则表达式中,[]表示满足括号中任一字符。比如“[hi]”,它就不是匹配“hi”了,而是匹配“h”或者“i”。

    在前面例子中,如果把正则表达式改为“[Hh]i”,就可以既匹配“Hi”,又匹配“hi”了。

    4.

    r"hi"

    这里字符串前面加了r,是raw的意思,它表示对字符串不进行转义。为什么要加这个?你可以试试print "hi"和r"hi"的区别。

    >>> print "hi"

    hi

    >>> print r"hi"

    hi

    可以看到,不加r的话,就没有了。因为python的字符串碰到“”就会转义它后面的字符。如果你想在字符串里打“”,则必须要打“\”。

    >>> print "\bhi"

    hi 

    这样的话,我们的正则表达式里就会多出很多“”,让本来就已经复杂的字符串混乱得像五仁月饼一般。但加上了“r”,就表示不要去转义字符串中的任何字符,保持它的原样。

    re.findall(r"hi", text)

    re是python里的正则表达式模块。findall是其中一个方法,用来按照提供的正则表达式,去匹配文本中的所有符合条件的字符串。返回结果是一个包含所有匹配的list。

    “.”在正则表达式中表示除换行符以外的任意字符。在上节课提供的那段例子文本中:

    Hi, I am Shirley Hilton. I am his wife.

    如果我们用“i.”去匹配,就会得到

    ['i,', 'ir', 'il', 'is', 'if']

    你若是暴力一点,也可以直接用“.”去匹配,看看会得到什么。

    与“.”类似的一个符号是“S”,它表示的是不是空白符的任意字符。注意是大写字符S。

    5

    在很多搜索中,会用“?”表示任意一个字符,“*”表示任意数量连续字符,这种被称为通配符。但在正则表达式中,任意字符是用“.”表示,而“*”则不是表示字符,而是表示数量:它表示前面的字符可以重复任意多次(包括0次),只要满足这样的条件,都会被表达式匹配上。

    结合前面的“.*”,用“I.*e”去匹配,想一下会得到什么结果?

    ['I am Shirley Hilton. I am his wife']

    是不是跟你想的有些不一样?也许你会以为是

    ['I am Shirle', 'I am his wife']

    这是因为“*”在匹配时,会匹配尽可能长的结果。如果你想让他匹配到最短的就停止,需要用“.*?”。如“I.*?e”,就会得到第二种结果。这种匹配方式被称为懒惰匹配,而原本尽可能长的方式被称为贪婪匹配。

  • 相关阅读:
    怎样解决:未找到路径“……”的控制器或该控制器未实现 IController?
    错误:org.springframework.jdbc.support.SQLErrorCodesFactory
    springbean的生命周期
    注解到处excel
    nio读取文件,输出文件
    AtomicReference
    唯一id
    hashmap1.7的死锁模拟
    数组模拟stack
    环形队列
  • 原文地址:https://www.cnblogs.com/youyuan-wang/p/6747875.html
Copyright © 2020-2023  润新知