• re模块


    正则表达式:可以匹配文本片段的模式(匹配模式pattern)

    字符串也是一种简单的正则表达式

    通配符(可以匹配任何字符):.

    如'.ython'可以匹配'python', 也可以匹配'jython'

    字符集:用中括号[]括起来的字符集

    如'[a-z]','[0-9]','[a-z-0-9]'分别表示字符a到z,0到9,a到z和0到9的任意一个

    子模式(subpattern):模式中的一部分,用括号括起来

    如'py(tho)n','tho'为一个子模式,也叫组(group),组序号取决于他左侧的括号数,整个模式字符串为第0组('python'),'tho'为第1组(左侧1个括号)

    (pattern)*:允许模式重复0次或多次

    (pattern)+:允许模式重复1次或多次

    (pattern){m, n}:允许模式重复m到n次

    如'py(tho)+n'表示中间的'tho'(第1组)可以重复1次或多次,可以匹配'python',也可以匹配'pythothothon'

    反转字符集:^

    如'[^abc]'表示可以匹配除a,b,c外的任何字符(注意加中括号!)

    注意:若^出现在模式的开头,需要对其进行转义

    管道符号:|(或)

    如'p(ython|attern)'可匹配'python',也可匹配'pattern'

    转意符号(对特殊字符进行转义):

    如果模式中有.,+,-,*,^,|,]等对匹配模式有特殊意义的符号,则需要进行转义,如模式'www.python.org'中的.表示字符'.',而不是通配符

    可选项:在子模式的括号外加?号,表示这个子模式可有可无

    如r'(http://)?(www.)?python.org'

    可以匹配以下字符串:

    'http://www.python.org'

    'http://python.org'

    'www.python.org'

    'python.org'

    注意:如果?号在子模式的括号内,表示非贪婪模式,默认情况下是贪婪模式,指出现重复运算符时,会尽可能多的匹配,

    如pattern = r'*(.+)*',遇到子字符串'*this* is *it*!'时,匹配的是最前面和最后面的*号,

    如果令pattern = r'*(.+?)*',?号在括号内,则表示非贪婪模式,尽可能少的匹配,会匹配前两个*号,再匹配后两个*号

    匹配字符串开头或结尾:如果只想匹配在开头或结尾出现模式的字符串,模式可以用^(开头)或$(结尾)

    如pattern = '^ht+p'(注意不同于反转字符集)会匹配'http://python.org','htttttttp://python.org',但不会匹配'python.http://org'

    同理'$ht+p'会会匹配在结尾处出现模式的字符串

    re.compile(pattern[, flags])

    将以字符串形式写的pattern转为真正的模式对象

    如:

    1  pattern = re.compile(r'''
    2       *               # some text
    3       ([^*]+)     # some text 
    4       *               # some text
    5        ''', re.VERBOSE)

    表示字符串'*([^*]+)*'被转换为匹配模式,VERBOSE表示re会忽略在模式中添加的空白(空白字符,tab,换行符等)

    re.search(pattern, string[, flags])  或者  pat.search(string)

    在字符串中寻找和模式相匹配的第一个子字符串,若能找到会返回MatchObject(值为Ture),否则返回None(值为False),如:

    1 if re.search(pat, string):
    2     print('found it!')

    re.match(pattern, string[, flags])

    在给定字符串开头处匹配,有就返回MatchObject(值为Ture),否则返回None(值为False),

    如re,match('p', 'python')返回MatchObject,re.match('p', 'www.python.org')返回None

    re.split(pattern, string[, maxsplit=0])

    用与模式相匹配的匹配项来分割字符串,如:

    1 some_text = 'alpha, beta,,,, gamma delta'
    2 print(re.split(',+', some_text))

    结果:

    ['alpha', ' beta', ' gamma delta']

    如果改成:

    1 some_text = 'alpha, beta,,,, gamma delta'
    2 print(re.split('[, ]+', some_text))

    结果:

    ['alpha', 'beta', 'gamma', 'delta']

    (如果模式包含小括号,括起来的字符组合会散布在分割后的子字符串之间)

    re.findall(pattern, string)

    以列表形式列出给定模式的所有匹配项

    re.sub(pat, repl, string[, count=0])

    用给定的替换式(repl)替换字符串string中的与pat相匹配的匹配项,返回替换后的string。如:

    1 pat = '{name}'
    2 text = 'dear {name}'
    3 print(re.sub(pat, 'Mr.Tan', text))

    结果:

    dear Mr.Tan

    re.escape(string)

    对字符串中所有可能被解释为正则运算符的字符进行转义,如:

    1 pat = re.escape('www.(python)+.org')
    2 print(pat)
    3 text = 'www.python.org or www.pythonpython.org or www.(python)+.org will be replaced'
    4 print(re.sub(pat, 'something', text))

    结果:

    www.(python)+.org
    www.python.org or www.pythonpython.org or something will be replaced

    匹配对象和组:

    match,split,findall等能对字符串进行模式匹配的函数在找到匹配项后都会返回MatchObject对象,这些对象也包含匹配模式中与子模式相对应的

    子字符串的信息和组(group)信息

    group([group1, ...])     获取给定子模式(组)的匹配项

    start([group])              返回给定组的匹配项在字符串中的开始位置

    end([group])               返回给定组的匹配项在字符串中的结束位置

    span([group])             返回一个组的开始和结束位置

    如:

    1 m = re.match('www.(.*).(.{3})', 'www.python.org')
    2 print(m)
    3 print(m.group(1), m.group(2))
    4 print(m.start(1), m.end(1), m.span(1))

    结果:

    <_sre.SRE_Match object; span=(0, 14), match='www.python.org'>
    python org
    4 10 (4, 10)

    re.sub()一个强大的功能:在替换内容(repl)中使用'\n'表示repl中\n处插入匹配项中第n组的子字符串!再用插入后的repl来替换匹配项!如:

    1 emphasis_pat = r'*([^*]+)*'
    2 text = 'hello, *world*!'
    3 print(re.sub(emphasis_pat, '<em>\1</em>', text))

    结果:

    hello, <em>world</em>!
  • 相关阅读:
    hdu1561--树形dp<依赖背包>
    hdu--1520--树形dp<写起来就是深搜啊>-<滚动数组优化>
    hdu--1595-另类最短路
    hdu--1599--最小环<会加深你对floyd的理解>
    hdu--1851--尼姆博弈&&巴什博弈<也有人用了sg可惜我还不懂>
    hdu--4920--原来一直写了速度慢的矩阵乘法
    hdu--4912--终于解脱了
    hdu--4947--我太天真了
    hdu--2576--高中数学..
    hdu--2579--第二次与女孩的约会
  • 原文地址:https://www.cnblogs.com/tan-wm/p/9347283.html
Copyright © 2020-2023  润新知