我有一个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
请你告诉我这里有什么不对......
答案 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
,因此您的模式可以匹配强项中的任何位置,因此您不必匹配任何前导码。