<p>冒着为一个已经有很多答案的问题添加另一个答案的风险,下面是我认为正则表达式解析器在这里的最佳使用方式:</p>
<pre><code>import re
the_id = 1740
with open("test.txt") as f:
for line in f:
match = re.search("id\s+(\d+)\s*$", line)
if match and the_id == int(match.group(1)):
print(line, end='')
</code></pre>
<p>这使得:</p>
<pre><code>2012-02-03 18:35:34 SampleClass3 [WARN] missing id 1740
</code></pre>
<p>您在这里所做的是使用解析器查找以以下内容结尾的行:“id”,后跟空格,后跟一个或多个数字(您在一个组中捕获),可以选择后跟任意数量的空格</p>
<p>然后将捕获的组转换为int并与id进行比较</p>
<p>顺便说一句,id存储在名为<code>the_id</code>的变量中,因为<code>id</code>是内置函数的名称,因此不是一个好的变量名称选择(干扰内置函数的使用)</p>
<hr/>
<h2>更新</h2>
<> P.Askter现在已经澄清,ID可以出现在直线的中间,不一定在末端。p>
<p>这可以通过对正则表达式进行简单的调整来轻松处理。将上述代码中的相关行更改为:</p>
<pre><code> match = re.search("id\s+(\d+)", line)
</code></pre>
<p>现在删除对数字</em>之后应该出现的内容的任何检查</p>
<p>因为表示“一个或多个”的<code>+</code>也是贪心的</em>(也就是说,它尽可能多地匹配与其相关的模式的部分</em>),ID的<em>整体</em>由括号中的组匹配,而不需要指定它后面的内容</p>
<p>给定输入文件</p>
<pre><code>2012-02-03 18:35:34 SampleClass6 [INFO] everything normal for id 174025851
2012-02-03 18:35:34 SampleClass4 [FATAL] system problem at id 1991740254
2012-02-03 18:35:34 SampleClass3 [DEBUG] detail for id 1304807656
2012-02-03 18:35:34 SampleClass3 [WARN] missing id 1740
2012-02-03 19:11:02 id 1740 SampleClass5 [TRACE] verbose detail
</code></pre>
<p>现在将输出:</p>
<pre><code>2012-02-03 18:35:34 SampleClass3 [WARN] missing id 1740
2012-02-03 19:11:02 id 1740 SampleClass5 [TRACE] verbose detail
</code></pre>