正则表达式其实内容不多,这是python一个比较人性化的地方,虽然有".","*","?",但是他们单独使用的机会很少,主要的使用是捏合在一起:(.*?)


首先要启动正则表达式,需要先import re。这样才能启动re下面的内部程序。

(.*?)是一个完全精确的算法,她不像“.*”那样贪心,甚至比“.*?”还不贪心。(.*?)使用的格式如下:

re.findall("定位符1(.*?)定位符2",需要检查的字段)

然后就会显示出()内的内容。

for instance:

    import re
    s="sdfxxhelloxxfsdfxxworldxxasdf"
    d=re.findall("xx(.*?)xx",s)
    print(d)

以上的程序显示结果是['hello', 'world'],注意,这是一个列表!即d是可以查序的,d[0]='hello'。

如果s改变一下变成以下的方式:

    import re
    s="""sdfxxhello
        xxfsdfxxworldxxasdf"""
    d=re.findall("xx(.*?)xx",s)
    print(d)

这样的输出结果是["fsdf"],而不是上一个结果。这是因为“.在默认的情况下不可以匹配转行符/n”。s现在是两段话,那么re.findall会先找第一段,如果在第一段找到了符合要求的会输出,如果没有找到,那么开始在第二段找,但是找归找,却是不继承第一段的内容。所以满足xx~xx之间要求的只有xxfsdfxx这一段,故而输出["fsdf"]。虽然紧跟着后面还有一个xxworldxx,但是由于前面的xx已经被上一段用走了,所以无法再选择了。

如果d=re.findall("xx(.*?)xx",s,re.S),这样的话输出是['hello\n', 'world']。re.S的意思是re模块里的S命令。


连用(.*?):

  

  import re
    s="89A000Boo2junkiA111Boooo2nium"
    d=re.findall("A(.*?)B(.*?)2",s)
    print(d)

这样的输出结果是[('000', 'oo'), ('111', 'oooo')],d[0]=('000', 'oo'),len(d)=2。


匹配纯数字:

    import re
    s="asdf12345hjkl"
    f=re.findall("(\d+)",s)
    print(f)

此时的输出结果是12345,f=re.findall("(\d+)",s)的效果等于f=re.findall("asdf(.*?)hjkl",s)。但是要注意(\d+)只能返回纯数字,如果s="asdf12a34w5hjkl"的话,那么再用这条语句,返回的是["12","34","5"]。


search命令

  

  import re
    s="asdfxxIxx231xxLOVExxDFd"
    f=re.search("xx(.*?)xx213xx(.*?)xx",s).group(1)
    print(f)

此时的结果是I,若后面改成group(2),那么输出结果是LOVE。可见后面的group号码是对应里面的(.*?)的值,而一旦group号码超出了(.*?)的个数,那么就会红字报错,Index Error.而如果不加group,那么会提示<_sre.SRE_Match object; span=(4, 20), match='xxIxx123xxLOVExx'>。


sub命令

    import re
    s="123RRRRR123"
    f=re.sub("123(.*?)123”,“12345”,s)
    print(f)

此时输出的结果是12345,可见如果有满足语句选择的量,那么会直接返回sub语句后面的内容。如果没有满足语句选择的量,那么返回的是s。sub主要是一个替换的作用,而无法替换的时候,就将原值返回。