2017-04-18 10 views
0

スクリプトを実行しているときに、正規表現を使用してログファイルからデータを取得するPythonスクリプトがあります。エラーが発生しました。sre_constants.error: unbalanced parenthesispython regexのアンバランス括弧エラー

以下は、私が正規表現をしようとしているスクリプトです。

#!/grid/common/pkgs/python/v2.7.10/bin/python 
import sys 
import re 
var1 = '' 
var2 = '' 
Html_file= open("/home/karn/healthCheck_result.html","w") 
html_str = """ 
<table border=1> 
    <tr> 
     <th bgcolor=fe9a2e>Hostname</th> 
     <th bgcolor=fe9a2e>Service</th> 
    </tr> 
""" 
Html_file.write(html_str) 
fh=open(sys.argv[1],"r") 
for line in fh: 
     pat_match=re.match("^\s+\HostName:\s+(.*?)\.*", line) 
     pat_match1=re.match("^\s+(.*?\)Service Status:\s+(.*Not.*?)\.*", line) 
     if pat_match: 
       Html_file.write("""<TR><TD bgcolor=fe9a2e>""" + pat_match.group(1) + """</TD>\n""") 
     elif pat_match1: 
       Html_file.write("""<TR><TD><TD>""" + pat_match1.group(2) + """</TD></TD></TR>\n""") 

私のログファイルには、以下のサンプルデータを持っている:私は「しない」の文字列と、それはその後、行全体がService Statusから開始することを印刷することを取得する場合を探しています。

[analytics1] sudo: /hm/it_script/DC/scripts/mainRun.py 
[analytics1] out: sudo password: 
[analytics1] out: HostName: analytics1 
[analytics1] out: Service Status: NTP Service is Running On the host analytics1 
[analytics1] out: Service Status: NSCD Service is Not Running On the host analytics1 
[analytics1] out: Service Status: Sendmail Service is Running On the host analytics1 
[analytics1] out: Service Status: Altris Service is Running On the host analytics1 
[analytics1] out: Service Status: Automount Service is Running On the host analytics1 
[analytics1] out: Service Status: Filesystem For Root(/) is more than 90% On the Host analytics1 
[analytics1] out: Service Status: Filesystem For /var is more than 90% On the Host analytics1 

あなたはこの行...ここ

答えて

1

をいただきました!間違ったアドバイスしてもらえ:

pat_match1=re.match("^\s+(.*?\)Service Status:\s+(.*Not.*?)\.*", line) 

をあなたは閉じ括弧はそれは次のように解釈されない\でエスケープあなたのいずれかを持っていますそのような。

私はこれは単純なタイプミスだと思うと、次のようになります。また

pat_match1=re.match("^\s+(.*?)Service Status:\s+(.*Not.*?)\.*", line) 

、両方のあなたの正規表現は、行の先頭には、少なくとも一つの空白文字続いを意味している^\s+で始まります。これはあなたのデータと一致するようには見えません。

また、まだ一致します(あなたが.をエスケープとしてではなく、任意の文字)が、0の出現はまだ試合であるという理由だけで、文字.の任意の数を意味している\.*と正規表現の両方を終了します。

ホスト名のHの前にも偽の\があります。

はおそらく、あなたは意味:

pat_match=re.search("HostName:\s+(.*)", line) 
pat_match1=re.search("Service Status:\s+(.*Not.*)", line) 

pat_match1の1が表示されていなかった古いグループを使用するので、また

注、そのI(すなわち代わりにグループ2、今のグループ1を使用します。) matchの代わりにsearchを使用したので、あなたのパターンは強力な場所のどこにでも一致することができます。したがって、プリアンブルに一致する必要はありません。

+0

SpoonMeiser ....タイプミスキャッチに感謝しかし、私は必要なデータを取得できませんでしたよ、それはちょうど$より..headerのみ 'bashの-4.1を印刷しhealthCheck_result.html <テーブルのボーダー= 1> <番目BGCOLOR = fe9a2e>ホスト名 <番目BGCOLOR = fe9a2e>サービス ' – krock1516

+0

SpoonMeiser、あなたの答えは正しい..です 私たちは、ホスト名は一度だけ、左手にpannelledとその下にあります得ることができますそのホストのためのサービスのサービスステータスame。 私はhtmlファイルを持っていますが、ここに添付することはできません。 – krock1516

+0

私はそれがここに答えるための範囲外だと思います。多分新しい質問をするでしょうか? – SpoonMeiser