如何在一个字符串上停止正则表达式与特定模式的匹配?

2024-09-30 14:28:12 发布

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

我试图用python中的正则表达式从纯文本中提取一些表的标题

普通测试是从一些PDF文件导出的,这些文件有很多\n。我试图在模式\n \n\n第一次出现之前停止匹配,但是regex总是返回更多的字符

下面是一个例子

字符串是:

contents = '\n\n\n\n\n\n\n\nClient: ABC area: Location Mc\nHole: 33-44   \n \n\n \n\nKJK TechCen    Rep # 5243 \n \n\n \n\n95 \n\nTable 3.1:  Joined Liq L1 (P = 40 \n@ 12), Test With 2 % \n\noF \n \n\n PressRel V \n% \n\nLiq/To \n% \n\nLiq/Sat \nBu \n\nDenCom'

我使用的正则表达式是:

re.findall(r'Table *\d.+:* *[a-zA-Z0-9 :&–=\n%@,()°-]+ [^ \n \n\n ]', contents)

我希望结果字符串从'Table XXX'开始,在第一个' \n \n\n '之前结束,如下所示:

'Table 3.1:  Joined Liq L1 (P = 40 \n@ 12), Test With 2 % \n\noF '

但我得到的实际线索是:

'Table 3.1:  Joined Liq L1 (P = 40 \n@ 12), Test With 2 % \n\noF \n \n\n PressRel V'

那么我如何修改regex来摆脱恼人的'\n \n\n PressRel V'


Tags: 文件字符串test文本l1withcontentstable
2条回答

与使用字符类不同,您可以使用正向的lookahead(?=来断言应该紧跟其后的是右边

Table *\d.+:* *[a-zA-Z0-9 :&–=\n%@,()°-]+(?= \n \n\n )

Regex demo

或者你可以在一个组中捕获你的值并匹配下面的换行符

(Table *\d.+:* *[a-zA-Z0-9 :&–=\n%@,()°-]+) \n \n\n 

Regex demo using a group

您需要一个非贪婪的+?而不是+,因为出现在结束序列中的所有字符都在中间的括号中

end = r' \n \n\n '
result = re.findall(r'Table[^:]*:[a-zA-Z0-9 :&–=\n%@,()°-]+?' + end, contents)
#result = ['Table 3.1:  Joined Liq L1 (P = 40 \n@ 12), Test With 2 % \n\noF \n \n\n ']

# to chop off the end, if needed:
result = [x[:-len(end)] for x in result]

示例中的[^ \n \n\n ]部分等于[^ \n],“不是换行符或空格的字符”

相关问题 更多 >