带DOTALL的Regex,如何让它在某个时刻停止?

2024-06-16 08:37:31 发布

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

我有这样一个python正则表达式:

re.compile(r'(\[chartsjs\].*\[/chartsjs\])', re.DOTALL)

我正在尝试对如下模式进行re.findall

^{pr2}$

但它似乎将第一个[charts]与最后一个[charts]匹配,并从中间抓取所有内容,因为当我将其打印到控制台时,我看到的是:

[u'[chartsjs]\r\nname: mychart\r\ntype: line\r\nlabels: fish, cat, dog\r\ndata: 4, 5, 6\r\ndata2:5, 7, 9\r\n[/chartsjs]\r\n\r\nthis is some text now fool\r\n\r\n[chartsjs]\r\nname: second\r\ntype: line\r\nlabels: 100, 500, 1000\r\ndata: 50, 100, 10000\r\ndata2: 100, 100, 100\r\n[/chartsjs]']

我希望正则表达式返回第一个匹配项,消除任意测试,然后找到另一个任意数量的匹配项。有办法吗?在


Tags: re内容line模式compilechartsfindallpr2
2条回答

这里最重要的是你想把.*变成.*?。正如其他人所回答的,还有其他优化正则表达式的方法,但我认为你问题的根源是你想匹配所有的东西,直到你看到那[/charts]模式,哪个?会给你的。在

你的正则表达式只有一个问题。在

.*将贪婪地匹配其路径上的所有内容。当它遇到第一个结束符[/charts]时,它将进一步检查前面是否还有{}。如果找到,它将继续。在

为了让它一开始停止[/charts],我们需要加个问号使它变懒。.*?这将继续匹配所有内容并在第一个位置停止{}

看看我测试过了:

import re

a="""
[charts]
name: mychart
type: line
labels: fish, cat, dog
data: 4, 5, 6
data2:5, 7, 9
[/charts]

this is some text

[charts]
name: second
type: line
labels: 100, 500, 1000
data: 50, 100, 10000
data2: 100, 100, 100
[/charts]
"""

for c in re.findall('(\[charts\].*?\[/charts\])',a, re.DOTALL):
    print c

输出:

^{pr2}$

相关问题 更多 >