2016-07-19 5 views
-2

私は、pythonを使ってファイルから特定のブロックのデータを印刷したいと思います。基本的にパーサーとして機能し、私の基準をマスキングするブロックだけを出力します。 私のファイルにコールセンターのログが含まれています。私は "####"で始まり、"</soap:Body>>"で終わる部分が欲しいですが、それは私のファイルのmsisdnとして知られている特定の番号を含む必要があります:"<msisdn>any number</msisdn>"私たちのパターンをPythonでmathchingするデータファイルの特定の部分だけを印刷する方法

また、だから、私はreadlines()を行うとき、私は正規表現を使用することはできません私は、列挙型(行)のデータ ここでデータが分割され、私は必要なチャンク全体を検索できません。

ファイルの一部はここにある:

####<Jun 4, 2016 12:05:50 PM IST> <Debug> <MessagingBridgeRuntimeVerbose> <ggneai29> <AircelESB_MS1> <[ACTIVE] ExecuteThread: '13' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1465022150722> <BEA-000000> <Bridge NPGBridge doTrigger(): state = 4 stopped = false> 
####<Jun 4, 2016 12:05:50 PM IST> <Error> <ALSB Logging> <ggneai29> <AircelESB_MS1> <[ACTIVE] ExecuteThread: '13' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <> <> <1465022150886> <BEA-000000> < [PipelinePairNode1, PipelinePairNode1_request, CreateVASReportingStage, REQUEST] *** CreateVASWrapper Reprting Stage VAS V-3.0 ***: <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <VASProxyType xmlns="http://xmlns.aircel.com/AircelTransformation/ProxyService/OrderProxy/1.0/CreateVASSubscriptionConsumerSchema"> 
    <TransactionId>DATA030620160431128801011429ADD</TransactionId> 
    <msisdn>8801011429</msisdn> 
    <productCode>DATA</productCode> 
    <action>ADD</action> 
    <IMSI>405801124044563</IMSI> 
    <SubsType>PrePaid</SubsType> 
    </VASProxyType> 
</soap:Body>> 
####<Jun 4, 2016 12:05:50 PM IST> <Error> <ALSB Logging> <ggneai29> <AircelESB_MS1> <[ACTIVE] ExecuteThread: '13' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <> <> <1465022150889> <BEA-000000> < [PipelinePairNode1, PipelinePairNode1_request, Authentication, REQUEST] ***REQUEST FOR VAS V-3.0 ****: <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <VASProxyType xmlns="http://xmlns.aircel.com/AircelTransformation/ProxyService/OrderProxy/1.0/CreateVASSubscriptionConsumerSchema"> 
    <TransactionId>DATA030620160431128801011429ADD</TransactionId> 

出力がなければならない:

< [ACTIVE] ExecuteThread:キューの '13':「weblogic.kernel.Default(セルフチューニング) > <「> <> <> < 1465022150886> < [PipelinePairNode1、PipelinePairNode1_request、CreateVASReportingStage、REQUEST] * CreateVASWrapper ReprtingステージVAS V-3.0 *

DATA030620160431128801011429ADD DATA プリペイド >

親切に助けて下さい!

+1

XMLパーサを使用してください。正規表現を使用するだけで頭痛になります。 –

+1

* "データが入力されています" * - 何? * "親切にそれを無視する" * - いいえ、あなたは質問を編集します。 – jonrsharpe

+0

提供されたデータに「>」で終わる部分はありません。質問を更新してください。 – Ohumeronen

答えて

0

コメントのように:あなたのXMLは無効です。有効なXMLを保証し、[etree] [1]や[Beautiful Soup] [2]のようなパーサを使用する方が良いでしょう。

しかし、あなたはとにかく、正規表現を使用したい場合は、あなたが試みることができる:あなたが何かを見つけたい場合は

import re 

mytext = [ 
    '####<Jun 4, 2016 12:05:50 PM IST> <Debug> <MessagingBridgeRuntimeVerbose> <ggneai29> <AircelESB_MS1> <[ACTIVE] ExecuteThread: \'13\' for queue: \'weblogic.kernel.Default (self-tuning)\'> <<WLS Kernel>> <> <> <1465022150722> <BEA-000000> <Bridge NPGBridge doTrigger(): state = 4 stopped = false>', 
    '####<Jun 4, 2016 12:05:50 PM IST> <Error> <ALSB Logging> <ggneai29> <AircelESB_MS1> <[ACTIVE] ExecuteThread: \'13\' for queue: \'weblogic.kernel.Default (self-tuning)\'> <<anonymous>> <> <> <1465022150886> <BEA-000000> < [PipelinePairNode1, PipelinePairNode1_request, CreateVASReportingStage, REQUEST] *** CreateVASWrapper Reprting Stage VAS V-3.0 ***: <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">', 
    '<VASProxyType xmlns="http://xmlns.aircel.com/AircelTransformation/ProxyService/OrderProxy/1.0/CreateVASSubscriptionConsumerSchema">', 
    ' <TransactionId>DATA030620160431128801011429ADD</TransactionId>', 
    ' <msisdn>8801011429</msisdn>', 
    ' <productCode>DATA</productCode>', 
    ' <action>ADD</action>', 
    ' <IMSI>405801124044563</IMSI>', 
    ' <SubsType>PrePaid</SubsType>', 
    '</VASProxyType>', 
    '</soap:Body>', 
    '<Jun 4, 2016 12:05:50 PM IST> <Error> <ALSB Logging> <ggneai29> <AircelESB_MS1> <[ACTIVE] ExecuteThread: \'13\' for queue: \'weblogic.kernel.Default (self-tuning)\'> <<anonymous>> <> <> <1465022150889> <BEA-000000> < [PipelinePairNode1, PipelinePairNode1_request, Authentication, REQUEST] ***REQUEST FOR VAS V-3.0 ****: <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">', 
    ' <VASProxyType xmlns="http://xmlns.aircel.com/AircelTransformation/ProxyService/OrderProxy/1.0/CreateVASSubscriptionConsumerSchema">', 
    '  <TransactionId>DATA030620160431128801011429ADD</TransactionId>', 
] 

searches = [ 
    { 
     "if_in": "<[ACTIVE] ExecuteThread:", 
     "search": "<\[ACTIVE[^<>]+> <<WLS Kernel>> <> <> <\d+>", 
    }, 
    { 
     "if_in": "PipelinePairNode1, PipelinePairNode1_request, Create", 
     "search": "< \[PipelinePairNode1, PipelinePairNode1_request, Create[^\[\]]+\]", 
    }, 
    { 
     "if_in": "CreateVASWrapper Reprting Stage VAS", 
     "search": "CreateVASWrapper Reprting Stage VAS[^*]+", 
    }, 
    { 
     "if_in": "<TransactionId>", 
     "search": "(?<=<TransactionId>)[^<>]+", 
    }, 
    { 
     "if_in": "<msisdn>", 
     "search": "(?<=<msisdn>)[^<>]+", 
    }, 
    { 
     "if_in": "<action>", 
     "search": "(?<=<action>)[^<>]+", 
    }, 
    { 
     "if_in": "<IMSI>", 
     "search": "(?<=<IMSI>)[^<>]+", 
    }, 
    { 
     "if_in": "<SubsType>", 
     "search": "(?<=<SubsType>)[^<>]+", 
    }, 
] 

result = "" 
found_once = [] 

for item in mytext: 
    for search in searches: 
     if search['if_in'] in item and search['if_in'] not in found_once: 
      f = re.findall(search['search'], item) 
      if f: 
       result += f[0] + " " 
       found_once.append(search['if_in']) 

print result 

searchesに追加します。

結果は次のようになります。

<[ACTIVE] ExecuteThread: '13' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1465022150722> < [PipelinePairNode1, PipelinePairNode1_request, CreateVASReportingStage, REQUEST] CreateVASWrapper Reprting Stage VAS V-3.0 DATA030620160431128801011429ADD 8801011429 ADD 405801124044563 PrePaid 
+0

私はxmlを扱っていません。これらはダウンロードされたファイルです。私はこのファイルをテキストファイルとして読んでいます。私はファイルを開き、必要な情報を含む部分だけを表示したい。ファイル全体ではありません – ganesh

+0

私はそれをすべてpythonを使ってやっています。私はreadlines()を使用してファイルのデータを取得しましたが、現在は必要な情報を表示する方法が残っています – ganesh

+0

はい、現在は整形式のXMLではありませんが、もっと簡単です。とにかく、私は自分の答えを編集しました。 –

0

このような問題を処理するための標準的な方法は、(SAXのXMLパーサのような...)「イベントベース」のパーサのいくつかの種類を作成することです:あなたのパーサは、ファイルの行を読み取り(あなたはメモリ内の全内容を読む必要はありません)、自分のルールに従って(正規表現を使いたいかもしれませんが、時には単純な文字列の方法も効率的です)、行に応じて行をスキャンしますコンテンツは、関連するデータと共に(コールバックメソッドによって処理される)所与の「イベント」を放出する。

興味深いデータブロックを開始する行( "####"で始まる行)、xmlデータを含む行の1つ、ブロックの最後の行のイベント( ""を含む行) - 次のようなもの:

class Parser(object): 

    def parse(self, logfile): 
     self.in_block = False 
     for line in logfile: 
      if self.is_block_start(line): 
       self.in_block = True 
       self.handle_block_start(line) 
      elif self.in_block: 
       if self.is_data(line): 
        self.handle_data(line) 
       elif self.is_block_end(line): 
        self.in_block = False 
        self.handle_block_end(line) 
      else: 
       continue 

    def is_block_start(self): 
     # your code here 

    def is_data(self): 
     # your code here 

    def is_block_end(self): 
     # your code here 

    def handle_block_start(self, line): 
     # your code here 

    def handle_data(self, line): 
     # your code here 

    def handle_block_end(self, line): 
     # your code here 
関連する問題