python正则表达式的不平衡括号错误

时间:2017-04-18 07:32:52

标签: python

我有一个python脚本使用正则表达式从日志文件中检索数据,而在运行脚本时我收到错误sre_constants.error: unbalanced parenthesis

以下是我尝试使用正则表达式的脚本。

#!/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""")
  

我的日志文件包含以下示例数据:我在哪里搜索&#34; Not&#34;字符串,如果它得到,然后打印整行,以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 个答案:

答案 0 :(得分: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似乎没有被使用(即现在使用组1而不是组2)

另请注意,我已使用search代替match,因此您的模式可以匹配强项中的任何位置,因此您不必匹配任何前导码。