zoukankan      html  css  js  c++  java
  • python正则表达式

    首先说 正则表达式是什么?

    正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
    许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
    引用自维基百科https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F

    定义是定义,太正经了就没法用了。我们来举个栗子:假如你在写一个爬虫,你得到了
    一个网页的HTML源码。其中有一段

    <html><body><h1>hello world<h1></body></html>

    你想要把这个hello world提取出来,但你这时如果只会python 的字符串处理,那么第一反应可能是

    s = <html><body><h1>hello world<h1></body></html>
    start_index = s.find('<h1>')

    然后从这个位置向下查找到下一个<h1>出现这样做未尝不可,但是很麻烦不是吗。需要考虑多个标签,一不留神就多匹配到东西了,而如果想要非常准确的匹配到,又得多加循环判断,效率太低。

    --------

    首先推荐使用r'string'来定义字符,免去转义字符的影响

    #'.',点号,在默认模式中,匹配任何一个字符,除了新的行newline。如果DOTALL标记指定了,那么还可以匹配newline。
    # '^',匹配字符串的开始
    # '$',匹配字符串的结束。比如foo匹配foo或者foobar,但是foo$只能匹配到foo。
    # '*',匹配0个或者多个字符,比如ab*,可以匹配a,ab,abbbb等
    # '+',匹配1个或者多个字符,比如ab+,可以匹配ab,或者abbbb
    # '?',匹配0或者1个字符,比如ab?只能匹配a或者ab。
    #贪婪模式,*?+,都是贪婪模式的,会尽可能多的匹配字符,在后面加上一个?则会变为非贪婪模式,尽可能匹配少的字符。
    #我们一般用非贪婪模式。

    # {m},指定匹配的数量,比如a{6}表示将匹配6个a字符,而不是5个,准确匹配。
    # {m,n},匹配在m~n个字符之间,包含m和n,比如a{3,5}将匹配3-5个a字符,一般会取上限来匹配。
    # 如果不指定m或者n,则表示没有上限,下限不能低于0个
    # {m,n}?,非贪婪模式的匹配,尽可能匹配少,取下限m来匹配。

    # [],用于创造一个字符的集合,字符可以单独出现或者使用0-9,a-z这种格式。
    # 比如:[amk]会匹配a,m或者k字符。[a-z]将会匹配a-z之间的任何一个字符。[0-5][0-9]匹配从00-59的所有字符。
    # 如果在[]中包含一个特殊字符的集合,比如[(+*)],这些特殊字符将会失去其特殊含义,只匹配字面意义,'('')''+''*'。
    # 如果在[]的开始有一个'^',比如[^5],将会匹配任何一个不是5的字符。

    # '|',A|B,AB是任意的RE表达式,可以匹配A或者B
    # (...),括号内的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号,编号+1。分组表达式作为一个整体,可以后接数量词。
    # 比如,(abc){2}匹配abcabc,a(123|456)c匹配a456c或者a123c。
    # (?P<name>...),分组,除了原有的编号外,指定一个额外的别名,比如:(?P<id>abc){2},可以匹配abcabc,通过.'id'来访问。
    # <number>,引用编号为<number>的分组匹配到的字符串。比如(d)abc1,可以匹配1abc1,或者5abc5
    # (?P=name),引用别名为<name>的分组匹配到的字符串,比如(?P<id>d)abc(?P=id),可以匹配1abc1,5abc5等。

    # d,表示数字,0-9之间的一个,比如adc,可以匹配a1c;
    # D,表示非数字,也可以用[^d]来代替,
    # s,表示空白字符
    # S,表示非空白字符
    # w,表示单词字符,[A-Za-z0-9_]
    # W,表示非单词字符。
    # A,仅匹配字符串的开头,Aabc可以匹配abc。
    # ,仅匹配字符串结尾,abc,匹配abc

    ---------

    #首先要导入re模块
    import re

    #将原生字符串对象传到compile方法中,可以获得一个pattern匹配模式
    pattern=re.compile(r'hello')
    #这个pattern可以用于进一步的匹配
    #flag参数,指匹配模式,可以选则
    re.I#忽略大小写
    re.M#多行模式
    re.S#点任意匹配,
    re.L#
    re.U
    re.X#详细模式,这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

    match方法会从要匹配的string的开头开始,尝试匹配pattern,一直向后,如果遇到无法匹配的字符,就返回None,如果匹配未结束已经到达string的末尾也会返回None,表示匹配失败。匹配成功会返回True,以及匹配到的内容的group。
    举个例子:(来自http://cuiqingcai.com/977.html)

    pattern=re.compile(r'hello')
    result1=re.match(pattern,'hello')
    result2=re.match(pattern,'helloo world')
    result3=re.match(pattern,'helo world')
    result4=re.match(pattern,'hello world')

    if result1:
    print(result1.group())
    else:
    print('1匹配失败!')
    if result2:
    print(result2.group())
    else:
    print('2匹配失败!')
    if result3:
    print(result3.group())
    else:
    print('3匹配失败!')
    if result4:
    print(result4.group())
    else:
    print('4匹配失败!')

    hello
    hello
    3匹配失败!
    hello

    #对于返回的这个结果,我们再通过一个例子来了解一下:
    import re
    m=re.match(r'(w+) (w+)(?P<sign>.*)','hello world!')#单词+空格+单词+任意字符

    print(m.string)#获取匹配时使用的文本
    print(m.re)#获取匹配时使用的pattern对象
    print(m.pos)#文本中开始搜索的位置
    print(m.endpos)#返回结束搜索的位置
    print(m.lastindex)#最后一个被捕获的分组在文本中的索引
    print(m.lastgroup)#最后一个最捕获的分组的别名
    print(m.group())#获得一个或多个分组截获的字符串,如果指定多个参数,将会以元祖形式返回
    print(m.group(1,2))#指定多个参数
    print(m.groups())#以元组形式返回所有分组截获的字符串
    print(m.groupdict())#返回具有别名的组的别名为Key,字符串为value的字典,不包含别名的组不统计
    print(m.start(2))#返回指定的组截获的子串在string中的起始索引
    print(m.end(2))#返回指定的组在string中的结束索引
    print(m.span(2))#返回(start(group),end(group))

    hello world!
    re.compile('(\w+) (\w+)(?P<sign>.*)')
    0
    12
    3
    sign
    hello world!
    ('hello', 'world')
    ('hello', 'world', '!')
    {'sign': '!'}
    6
    11
    (6, 11)

    类似与match方法,但是match会检测re是不是在string的开始位置就能够匹配到,而search会扫描整个string来匹配。match方法只有在0位置匹配成功的话才会返回,如果不是开始i位置,即使后面由匹配,也会返回None。

    import re
    pattern=re.compile(r'world')
    match=re.search(pattern,'hello world!')
    if match:
    print(match.group())

    world

    https://blog.csdn.net/fjb2080/article/details/79712380

  • 相关阅读:
    vue入门:(方法、侦听器、计算属性)
    vue入门:(模板语法与指令)
    前端资源
    CSS3总结七:变换(transform)
    CSS总结六:动画(一)ransition:过渡、animation:动画、贝塞尔曲线、step值的应用
    设计模式(一):简单工厂
    正则命令积累
    命令模式 & 策略模式 & 模板方法
    抽象工厂:简单游戏角色
    简单工厂模式—>工厂模式
  • 原文地址:https://www.cnblogs.com/yizhixuepython/p/9266453.html
Copyright © 2011-2022 走看看