<p>两种重新的兴趣模式似乎是…:</p>
<pre><code>p1 = r'^---- ([^(]+) \(([^)]+)\) changed status from (\w+) to (\w+) (\S+) (\S+) ----$'
p2 = r'^---- ([^(]+) \(([^)]+)\) became (\w+) (\S+) (\S+) ----$'
</code></pre>
<p>所以我会:</p>
<pre><code>import csv, re, sys
# assign p1, p2 as above (or enhance them, etc etc)
r1 = re.compile(p1)
r2 = re.compile(p2)
data = []
with open('somefile.txt') as f:
for line in f:
m = p1.match(line)
if m:
data.append(m.groups())
continue
m = p2.match(line)
if not m:
print>>sys.stderr, "No match for line: %r" % line
continue
listofgroups = m.groups()
listofgroups.insert(2, 'NaN')
data.append(listofgroups)
with open('result.csv', 'w') as f:
w = csv.writer(f)
w.writerow('UserName/ID Previous Status New Status Date Time'.split())
w.writerows(data)
</code></pre>
<p>如果我描述的这两种模式不够通用,当然可能需要对它们进行调整,但我认为这种通用方法将是有用的。虽然许多使用堆栈溢出的Python用户非常不喜欢REs,但我发现它们对于这种实用的即席文本处理非常有用。</p>
<p>也许其他人想使用REs来实现一些荒谬的用途,比如对CSV、HTML、XML的特殊解析。。。--还有许多其他类型的<em>结构化</em>文本格式,它们都有非常好的解析器!而且,其他任务远远超出REs的“舒适区”,需要像<a href="http://pyparsing.wikispaces.com/" rel="noreferrer">pyparsing</a>这样的可靠的通用解析器系统。或者在另一个极端的超级简单的任务中,使用简单的字符串做得非常好(例如,我记得最近的一个SO问题使用<code>if re.search('something', s):</code>,而不是<code>if 'something' in s:</code>!-). </p>
<p>但是对于REs适用的相当广泛的任务(不包括一端最简单的任务,另一端解析结构化的或有点复杂的语法),使用它们并没有什么错,我建议所有程序员至少学习REs的基础知识。</p>