数据处理:从A文件匹配关键词分行输出

技巧分享 技巧 分享

场景:有一个文件A,需要匹配其中每一行的关键词,如果在当前行中没有匹配到,则输出null,匹配到则输出此关键词

举例

待匹配内容:

alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"ET EXPLOIT Adobe Acrobat Reader Malicious URL Null Byte"; flow: to_server,established; content:".pdf|00|"; http_uri; reference:url,idefense.com/application/poi/display?id=126&type=vulnerabilities; reference:url,www.securiteam.com/windowsntfocus/5BP0D20DPW.html; reference:cve,2004-0629; reference:url,doc.emergingthreats.net/bin/view/Main/2001217; classtype:attempted-admin; sid:2001217; rev:11;)
...下面还有很多行数据,在此不贴...

比如说,此时需要匹配 reference:url,*****,可以使用正则匹配url,(.*?);,但此时如果有行数据里没有匹配到,那么最后输出就无法判断是哪一行没有匹配的关键词,输出的数据对应行数就会乱掉

实现

# coding=utf-8
import re

f_rule = open('.\Test.rules','r')
f_rule_readlines = f_rule.readlines()

#匹配行数
for i in xrange(0,716):
    #print f_rule_readlines[i]
    p=re.search(r'url,(.*?);',f_rule_readlines[i])

    if p==None:#当前行数没有匹配到关键词时
        newRule='null'
    else:
        newRule=p.group()
    print newRule    

补充姿势

re.search(pattern, string)函数
会在string内查找匹配,只要找到一个成功的匹配,就返回,若在整个string内都找不到匹配的,则返回None

re.match(pattern, string)函数
只从string的开始位置匹配,即使是中间位置有匹配的项,也不算匹配成功,也就是说只有在开始位置匹配成功,才有返回,若不是开始位置匹配成功,则返回None

正则表达式中,group()用来提取分组截获的字符串()用来分组。举例:

import re
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)   #123abc456,返回整体
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)   #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)   #456
  1. 正则表达式中的三组括号把匹配结果分成三组
     group() 同group(0)就是匹配正则表达式整体结果

 group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。

  1. 没有匹配成功的,re.search()返回None
  2. 当正则表达式中没有括号,group(1)肯定不对

新评论

称呼不能为空
邮箱格式不合法
网站格式不合法
内容不能为空