• Python 正则表达式


    用perl的正则表达式习惯了,简单直接,非常方便,但转向python后,发现竟然和perl的方式不一样,感觉有点不适应,不过仔细阅读了关于python的正则表达式后,发现(re模块)其实也和perl差不多,只是表现形式不一样。

    这里记录的是直接了当的案例和少许解释,只是为方便查阅。

    使用raw字符串

    元字符:. ^ $ * + ? { [ ] \ | ( )

    如果要匹配的正式元字符,就需要使用反斜杠\,但这样有时会让程序显得很难看懂。

    raw字符串就是为了解决这个问题:在字符串前加个 "r" 反斜杠,这就相当于perl中的单引号,让字符串不被任何特殊方式处理。

    比如:r"\n" 就是包含"\" 和 "n" 的两个字符,而 "\n" 则是一个字符,表示一个换行。

    常规字符串 Raw 字符串
    "ab*" r"ab*"
    "\\\\section" r"\\section"
    "\\w+\\s+\\1" r"\w+\s+\1"

    编译正则表达式

    正则表达式被编译成 `RegexObject` 实例,可以为不同的操作提供方法,如模式匹配搜索或字符串替换。

    >>> import re
    >>> pattern = '^M?M?M?$'
    >>> re.search(pattern, 'M')

    >>> compiledPattern = re.compile(pattern)

    >>> dir(compiledPattern)
    ['findall', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
    >>> compiledPattern.search('M') 

    用 'M' 作参数来调用已编译的 pattern 对象的 search 函数与用正则表达式和字符串 'M' 调用 re.search 可以得到相同的结果,只是快了很多。 (事实上,re.search 函数仅仅将正则表达式编译,然后为你调用编译后的 pattern 对象的 search 方法。)
      在需要多次使用同一个正则表达式的情况下,应该将它进行编译以获得一个 pattern 对象,然后直接调用这个 pattern 对象的方法。

    也可以采用一些参数,实现不同的特殊功能和语法变更。比如经常使用的忽略大小写:
    p = re.compile('ab*', re.IGNORECASE)

    匹配

    re.match()

    决定 RE 是否在字符串刚开始的位置匹配.

    re.search()

    扫描字符串,找到这个 RE 匹配的位置.

    >>> re.match("c", "abcdef")  # No match
    >>> re.search("c", "abcdef") # Match
    <_sre.SRE_Match object at ...>
    

    search()中,也可以使用“^”来匹配字符串开头,就像Perl中一样。

    >>> re.match("c", "abcdef")  # No match
    >>> re.search("^c", "abcdef") # No match
    >>> re.search("^a", "abcdef")  # Match
    <_sre.SRE_Match object at ...>
    

    Note however that in MULTILINE mode match() only matches at the beginning of the string, whereas using search() with a regular expression beginning with '^' will match at the beginning of each line.

    >>> re.match('X', 'A\nB\nX', re.MULTILINE)  # No match
    >>> re.search('^X', 'A\nB\nX', re.MULTILINE)  # Match
    <_sre.SRE_Match object at ...>

    findall()
    找到 RE 匹配的所有子串,并把它们作为一个列表返回
    finditer()
    找到 RE 匹配的所有子串,并把它们作为一个迭代器返回

    参考文档:
    1. http://wiki.ubuntu.com.cn/Python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97
    2. http://woodpecker.org.cn/diveintopython/refactoring/refactoring.html

  • 相关阅读:
    对post提交数据Content-Type的理解
    预加载的实现方式
    ajax跨域简单请求与复杂请求
    web前端图片模糊到清晰的实现过程
    vue子组件调用父组件的方法
    vue子组件如何向父组件传值
    如何实现下拉弹出框渐渐弹出
    DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化
    解决 Bash On Windows 下载慢或无法下载的问题
    NPOI扩展--判断指定单元格是否为合并单元格和输出该单元格的行列跨度(维度)
  • 原文地址:https://www.cnblogs.com/yuyan/p/2788322.html
Copyright © 2020-2023  润新知