使用regex解析并打印lin

2024-09-22 16:23:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个正则表达式,用于打印指定范围内的文件行。你知道吗

例如:

my _car_(10)
skoda
audi

my home
good

my _car_(11)
benz

输出为:

(10)
skoda
audi
(11)
benz

预期:(我还需要打印my _car_行)

my _car_(10)
skoda
audi
my _car_(11)
benz

编码:

import re
with open("in1.txt") as f:
   lines = f.read()
   m = re.findall(r'(?s)my _car_\s*(.*?)my', lines)
   for i in m:
       print i

请帮我解决它,答案将不胜感激!你知道吗


Tags: 文件importre编码homemywithopen
3条回答

要包含my _car_,只需移动capture组的左括号。你知道吗

但这又提出了第二个问题。您在结果中包含了后面的“my”。使用lookahead(?=...)避免捕获它。你知道吗

但这又引发了另一个问题。最后一辆车没有尾随的my。所以我们也搜索字符串的结尾。你知道吗

最终结果:

m = re.findall(r'(?s)(my _car_\s*.*?)(?=my|$)', lines)

与正则表达式搜索无关,print的使用在项之间引入了一个额外的行。我们可以用os.write()替换print,也可以使用后面的,来避免多余的行。你知道吗

课程:

import re
with open("in1.txt") as f:
   lines = f.read()
   m = re.findall(r'(?s)(my _car_\s*.*?)(?=my|$)', lines)
   for i in m:
       print i,

结果:

$ python in1.py 
my _car_(10)
skoda
audi

my _car_(11)
benz

您可以使用积极的前瞻来实现这一点:

(?s)(my _car_\s*.*?)(?=(?:\n{2}|\Z))

(?=(?:\n{2}|\Z))断言_car_之后的部分后跟2个换行符或字符串的结尾(\Z)。你知道吗

测试:

>>> import re
>>> with open('in1.txt') as f:
...     lines = f.read()
...     m = re.findall(r'(?s)(my _car_\s*.*?)(?=(?:\n{2}|\Z))', lines)
...     for i in m:
...             print i
... 
my _car_(10)
skoda
audi
my _car_(11)
benz

您只需扩展捕获组:

从这个

m = re.findall(r'(?s)my _car_\s*(.*?)my', lines)

为了这个

m = re.findall(r'(?s)(my _car_\s*.*?)my', lines)

应该这样做。你知道吗

但是根据您的正则表达式,您必须在最后一个值之后有一个my才能捕获它。你知道吗

相关问题 更多 >