Python正则表达式使用
参考资料:
前言
由于遇到一个提取字符串某个子串的问题,刚开始使用了暴力方法求解,后面在舍友大佬帮助下,使用了正则表达式来提取,质量明显高了一档。详细的方法,以及详细的参数教程里都已叙述的非常详尽,这里主要介绍一下遇到问题以及解决问题的方案。
问题描述
'''Obtaining JSON from switch...DoneControl utility for runtime P4 table manipulationRuntimeCmd: 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: '''
从上述字符串中提取出,dmac
、mcast_src_pruning
、smac
、sad
问题解决
可以观察到需提取的字符串都有一个特点,都是介于RuntimeCmd
,且后面都有跟着一个[xxx]
,所以我们也从这里入手。
下面给出具体代码以及具体的正则解释
import restr = '''Obtaining JSON from switch...DoneControl utility for runtime P4 table manipulationRuntimeCmd: 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 == '\n':# flag = 2 # print i# print table_namematchObj = re.findall('(\S+)(?=[\s]*\[.*\])', str, re.M | re.I)print matchObj
上面注释掉的代码为暴力解法,下列则为正则表达式求解,具体函数功能可查找参考文献,这里介绍正则表达式,即(\S+)(?=[\s]*\[.*\])
这个串。
第一个()
内部的数据则是所需提取的数据,\S
表示非空字符,+
表示非空字符至少出现一次,(?=)
表示前向肯定界定符,表示之后所连着的语句是什么,\s
表示空字符,[\s]*
表示非空字符出现大于等于0次,由于[
是特殊字符,所以需要加\
进行转义,.
表示任意字符,.+
则表示任意语句,\]
则与前面的[
一样,需要进行转义。通过此正则表达式,则可成功提取出我们所需的数据。
['dmac', ''] ['dmac','mcast_src_pruning','smac','sad']
为一个list对象,成功提取。