zoukankan      html  css  js  c++  java
  • Python正则表达式使用

    Python正则表达式使用

    参考资料:

    Python正则表达式| 菜鸟教程

    Python正则表达式详解 - 我当道士那儿些年 - 博客园

    前言

    由于遇到一个提取字符串某个子串的问题,刚开始使用了暴力方法求解,后面在舍友大佬帮助下,使用了正则表达式来提取,质量明显高了一档。详细的方法,以及详细的参数教程里都已叙述的非常详尽,这里主要介绍一下遇到问题以及解决问题的方案。

    问题描述

    '''Obtaining JSON from switch...
    Done
    Control utility for runtime P4 table manipulation
    RuntimeCmd: dmac                           [implementation=None, mk=ethernet.dstAddr(exact, 48)]
    mcast_src_pruning              [implementation=None, mk=standard_metadata.instance_type(exact, 32)]
    smac                           [implementation=None, mk=ethernet.srcAddr(exact, 48)]
    sad                            [implementation=None, mk=ethernet.srcAddr(exact, 48)]
    RuntimeCmd: '''
    

    从上述字符串中提取出,dmacmcast_src_pruningsmacsad

    问题解决

    可以观察到需提取的字符串都有一个特点,都是介于RuntimeCmd,且后面都有跟着一个[xxx],所以我们也从这里入手。

    下面给出具体代码以及具体的正则解释

    import re
    
    str = '''Obtaining JSON from switch...
    Done
    Control utility for runtime P4 table manipulation
    RuntimeCmd: dmac                           [implementation=None, mk=ethernet.dstAddr(exact, 48)]
    mcast_src_pruning              [implementation=None, mk=standard_metadata.instance_type(exact, 32)]
    smac                           [implementation=None, mk=ethernet.srcAddr(exact, 48)]
    sad                            [implementation=None, mk=ethernet.srcAddr(exact, 48)]
    RuntimeCmd: '''
    
    # flag = 0
    # table_name = []
    # name = ''
    # for i in str:
    #     if i == 'R':
    #         flag = 1
    #         print flag
    #     elif i == ' ' and flag == 1:
    #         flag = 2
    #         print flag
    #     elif flag == 2 and i != ' ':
    #         name = name + i
    #         print flag
    #     elif flag == 2 and i == ' ':
    #         table_name.append(name)
    #         name = ''
    #         flag = 3
    #         print flag
    #     elif flag == 3 and i == '
    ':
    #         flag = 2
        # print i
    # print table_name
    
    
    matchObj = re.findall('(S+)(?=[s]*[.*])', str, re.M | re.I)
    
    print matchObj
    

    上面注释掉的代码为暴力解法,下列则为正则表达式求解,具体函数功能可查找参考文献,这里介绍正则表达式,即(S+)(?=[s]*[.*])这个串。

    第一个()内部的数据则是所需提取的数据,S表示非空字符,+表示非空字符至少出现一次,(?=)表示前向肯定界定符,表示之后所连着的语句是什么,s表示空字符,[s]*表示非空字符出现大于等于0次,由于[是特殊字符,所以需要加进行转义,.表示任意字符,.+则表示任意语句,]则与前面的[一样,需要进行转义。通过此正则表达式,则可成功提取出我们所需的数据。

    ['dmac','mcast_src_pruning','smac','sad']
    

    为一个list对象,成功提取。

  • 相关阅读:
    Ax+By+C=0 直线一般式拟合 c++/python
    win7结束进程 时,提示“拒绝访问”、“没有此任务的实例运行” taskkill 结束不了进程
    Keras神经网络转到Android可用的模型
    Keras深度神经网络训练IMDB情感分类的四种方法
    解决win7 word 2016中不能加载EndNote x7
    Google Coral Dev Board
    pydot` failed to call GraphViz.Please install GraphViz
    使用可视化图表对 Webpack 2 的编译与打包进行统计分析
    webpack 多环境配置
    格式化时间
  • 原文地址:https://www.cnblogs.com/wpqwpq/p/6854487.html
Copyright © 2011-2022 走看看