regex Python re模块:如何从文件中提取捕获组

epfja78i  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(112)

我有一个文件test.txt,其中包含以下内容:

CAR
one a. , z.
two b.
three c.
AIRPLANE
one a. , z.
two b.
three c.
BOAT
one a. , z.
two b.

字符串
我想提取从CAR到AIRPLANE(但不包括AIRPLANE)的所有内容,并将其写入output.txt。这个正则表达式为我提供了捕获组中所需的一切:
r"(CAR.*)AIRPLANE"s . link:https://regex101.com/r/QJMJFh/1
为了测试我的输入test.txt正在进入程序,我这样做:

s = open('test.txt')
s_content = s.read()
print(s_content)


它成功并产生以下结果:

CAR
one a. , z.
two b.
three c.
AIRPLANE
one a. , z.
two b.
three c.
BOAT
one a. , z.
two b.


但是,当我运行这个:

s_output = re.search(r"(CAR.*)AIRPLANE"s, s_content).group(1)
print(s_output)


它失败了,说

Cell In[85], line 4
    s_output = re.search(r"(CAR.*)AIRPLANE"s, s_content).group(1)
                         ^
SyntaxError: invalid syntax. Perhaps you forgot a comma?


我还能如何使用re模块从这个文件中提取一个捕获组?
This question非常相似,实际上我用它作为我代码的基础。然而,我的正则表达式与那个例子中的不同,并且在re.search上需要不同的标志。

8aqjt8rx

8aqjt8rx1#

如果你想在dot all模式下运行正则表达式,那么你应该在调用re.search时使用flags选项:

s_output = re.search(r'(CAR.*?)AIRPLANE', s_content, flags=re.S).group(1)
print(s_output)

字符串
还请注意,我在这里使用了lazy dot,在第一次出现AIRPLANE时停止。更一般地说,你可能想使用这个版本,它在最近的AIRPLANE出现或输入结束时停止,以先发生的为准:

s_output = re.search(r'(CAR.*?)(?=\bAIRPLANE|$)', s_content, flags=re.S).group(1)
print(s_output)

相关问题