zoukankan      html  css  js  c++  java
  • Python基础--正則表達式基本的语法以及re模块

    正则是个非常牛逼的东西,python中当然也不会缺少。

    所以今天的Python就跟大家一起讨论一下python中的re模块。

    re模块包括对正則表達式的支持。

    什么是正则:
    正則表達式是能够匹配文本片段的模式。
    正則表達式’Python’能够匹配’python’

    通配符
    .表示匹配不论什么字符:
    ‘.ython’能够匹配’python’和’fython’

    对特殊字符进行转义
    ‘python.org’匹配‘python.org’

    字符集
    ‘[pj]ython’能够匹配’python’和’jython’

    反转字符集
    ‘[^abc]’能够匹配除了abc之外的不论什么字符

    选择符
    使用管道符号|

    可选项
    加上问好就变为了可选项:
    r’(http://)?(www.)?python.org‘仅仅能匹配以下几种:

    'http://www.python.org'
    'http://python.org'
    'www.python.org'
    'python.org'

    反复子模式
    *:同意模式反复0次或多次
    +:同意模式反复1次或多次
    {m, n}同意模式反复m-n次

    当然,正则语法规则非常多,远不止上面的这些。可是我们仅仅能点到为止了,由于这篇博客的目的是介绍Python中的模块,re模块。

    re 模块使 Python 语言拥有全部的正則表達式功能。
    compile 函数依据一个模式字符串和可选的标志參数生成一个正則表達式对象。

    该对象拥有一系列方法用于正則表達式匹配和替换。


    re 模块也提供了与这些方法功能全然一致的函数,这些函数使用一个模式字符串做为它们的第一个參数。

    re中重要的函数:

    compile(pattern[, flags]) 依据包括正則表達式的字符串创建模式对象
    search(pattern, string[, flags]) 在字符串中寻找模式
    match(pattern, string[, flags]) 在字符串的開始处匹配模式
    split(pattern, string[, maxsplit=0]) 依据匹配项切割字符串
    findall(pattern, string)  列出字符串中模式的全部匹配项
    sub(pat, rep, string[, count=0]) 字符串中全部pat的匹配项用repl替换
    escape(string)    将字符串中全部特殊表达式字符转义

    以下就进行简单的应用:

    使用match

    import re
    print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
    print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配

    使用search

    import re
    print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
    print(re.search('com', 'www.runoob.com').span())  # 不在起始位置匹配

    这时候须要停一下,match和search的差别呢?
    看看结果先:

    match样例中结果:
    (0, 3)
    None
    
    search样例中结果:
    (0, 3)
    (11, 14)

    match()函数仅仅检測RE是不是在string的開始位置匹配,search()会扫描整个string查找匹配;
    也就是说match()仅仅有在0位置匹配成功的话才有返回。假设不是開始位置匹配成功的话,match()就返回none。

    search()会扫描整个字符串并返回第一个成功的匹配。

    使用sub
    Python 的re模块提供了re.sub用于替换字符串中的匹配项。

    #!/usr/bin/python
    import re
    
    phone = "2004-959-559 # This is Phone Number"
    
    # Delete Python-style comments
    num = re.sub(r'#.*$', "", phone)
    print "Phone Num : ", num
    
    # Remove anything other than digits
    num = re.sub(r'D', "", phone)    
    print "Phone Num : ", num

    结果:

    Phone Num :  2004-959-559
    Phone Num :  2004959559

    最后献上菊花:

    ^   匹配字符串的开头
    $  匹配字符串的末尾。
    .   匹配随意字符。除了换行符。当re.DOTALL标记被指定时,则能够匹配包括换行符的随意字符。
    [...]   用来表示一组字符,单独列出:[amk] 匹配 'a''m''k'
    [^...]  不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
    re* 匹配0个或多个的表达式。

    re+ 匹配1个或多个的表达式。 re? 匹配0个或1个由前面的正則表達式定义的片段,非贪婪方式 re{ n} re{ n,} 精确匹配n个前面表达式。

    re{ n, m} 匹配 n 到 m 次由前面的正則表達式定义的片段,贪婪方式 a| b 匹配a或b (re) G匹配括号内的表达式。也表示一个组 (?imx) 正則表達式包括三种可选标志:i, m, 或 x 。仅仅影响括号里的区域。

    (?-imx) 正則表達式关闭 i, m, 或 x 可选标志。

    仅仅影响括号里的区域。 (?

    : re) 相似 (...), 可是不表示一个组 (?imx: re) 在括号里使用i, m, 或 x 可选标志 (?-imx: re) 在括号里不使用i, m, 或 x 可选标志 (?#...) 凝视. (?= re) 前向肯定界定符。假设所含正則表達式,以 ... 表示,在当前位置成功匹配时成功,否则失败。

    但一旦所含表达式已经尝试。匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 (?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 (?> re) 匹配的独立模式。省去回溯。

    w 匹配字母数字 W 匹配非字母数字 s 匹配随意空白字符,等价于 [ f]. S 匹配随意非空字符 d 匹配随意数字,等价于 [0-9]. D 匹配随意非数字 A 匹配字符串開始  匹配字符串结束。假设是存在换行,仅仅匹配到换行前的结束字符串。c z 匹配字符串结束 G 匹配最后匹配完毕的位置。  匹配一个单词边界,也就是指单词和空格间的位置。

    比如, 'er' 能够匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 B 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 , , 等. 匹配一个换行符。匹配一个制表符。等 1...9 匹配第n个分组的子表达式。

    10 匹配第n个分组的子表达式,假设它经匹配。否则指的是八进制字符码的表达式。

  • 相关阅读:
    vue单文件组件形成父子(子父)组件之间通信(vue父组件传递数据给子组件,子组件传递数据给父组件)
    appium 问题四的解决办法(模拟器打开的页面弹出框与脚本打开页面的弹出框不一致)
    appium 自动化问题三--键盘关键字的使用
    RF+appium自动化问题二解决思路
    appium自动化滑动鼠标滚动条的用法
    appium自动化中元素定位碰到的问题一
    appium自动化时,输入中文不显示的问题解决
    appium自动化模拟器使用
    pycharm 无法识别selenium,appium等工具时的解决办法
    Mysql基础学习(二)之DQL的使用
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7221655.html
Copyright © 2011-2022 走看看