正则表达式帮助

我忘记了如何使用标签之间找到多个实例
常用表达.特别是我想找到一个之间的所有文本
多行文件中的一系列开始/结束对.
我试过了:
并在第一个开始和最后一端之间得到了一切.我猜
因为贪婪的比赛.我想做的是一个清单
元素是另一个开始/结束对之间的文本.
tia
大卫·李斯

# 回答1


大卫·李斯(David Lees)写道:并在第一开始和最后一场比赛之间得到了一切.我猜是因为贪婪的比赛.我要做的是一个列表,每个元素是另一个开始/结束对之间的文本.
人们会告诉您使用非怪兽比赛,但这通常是
在这样的情况下,不好的主意:RE引擎必须存储大量的后台 -
跟踪信息,您的程序将消耗更多
内存比必须(并且可能用完堆栈和/或内存).
一种更好的方法是进行两次搜索:首先搜索"开始",
一旦找到了这一点,请寻找"结束"
导入
POS = 0
start = re.compile("开始")
end = re.compile(" end")
而1:
M = start.Search(文本,POS)
如果不是m:
休息
start = m.end()
m = end.Search(文本,开始)
如果不是m:
休息
end = m.start()
流程(文本[开始:end])
pos = m.end()#前进
在这一点上,很明显您不必真正使用
常用表达:
POS = 0
而1:
start = text.find("开始",pos)
如果开始<0:
休息
开始 += 5
end = text.find(" end",start)
如果结束<0:
休息
流程(文本[开始:end])
pos =结束#前进

- >
# 回答2


在THU,2003年7月17日04:27:23 GMT,David Lees 你很近.对于非怪兽,在贪婪表达后添加问号:
['first','\ nsecond \ n','问题开始嵌套','last']
注意嵌套的开始端发生了什么.如果你有筑巢,你
不仅需要简单的正则方法.
问候,
Bengt Richter
# 回答3


弗雷德里克,
不确定原始海报,但我可以使用.谢谢!
- 澳大利亚
" fredrik lundh" 在消息新闻中写道: ...并在第一个开始和最后一端之间得到了一切.我猜是因为贪婪的比赛.我要做的是一个列表,每个元素是另一个开始/结束对之间的文本.人们会告诉您使用非怪兽比赛,但这在这样的情况下通常是一个坏主意:RE Engine必须存储大量的后跟踪信息,您的程序将消耗更多的内存,而不是所需的(和)可能用完堆栈和/或内存).一种更好的方法是进行两次搜索:首先搜索"开始",一旦发现了一个搜索,请查找" end" import re pos = 0 start = re.compile(" begin")end = re. compile(" end")时1:m = start.search(文本,pos)如果没有 M:break start = m.end()m = end.search(文本,s​​tart)如果不是m:break end = m.start()process(text [start:end:end])pos = m.end()#移动在这一点上,很明显,您不必真正使用正则表达式:pos = 0 wher 1:start = text.find("开始",pos)如果开始<0:break start += 5 end eend = text.find(" end",start)如果end <0:break Process(文本[start:end])pos = end#向前移动
# 回答4


在2003年7月17日星期四08:44:50 +0200," fredrik lundh" 写道:人们会告诉您使用非蛋白游戏,但这通常是Abad的想法.像这样:RE引擎必须存储大量的后台 -
您会这​​么说吗?还是这种情况如何?
跟踪信息,您的程序将消耗多大的病情(并且可能用尽堆栈和/或内存).
对于上述情况,将正则拨号汇编为状态机器
那只是有几个州可以识别出来的状态.*然后恢复到.
如果下一个不是n,如果是n,请类似地寻找d,如果不是,
恢复为.*,等等?对于短期比赛,似乎
相对便宜?
在这一点上,很明显,您实际上不必表达式表达式:pos = 0 wher 1:start = text.find(" begin",pos)如果开始<0:break start +start += 5 end
或以例外而不是测试打破循环:
... process(begxxx.split('end')[0])
...
处理('S1')
处理('S2')
问候,
Bengt Richter
# 回答5


安德鲁·贝内特(Andrew Bennetts)写道:^^^^^^^^ re.findall怎么样?例如.:
实际上,这是我要问的多行类型文件的失败.
[' 酒吧 ']
# 回答6


在星期五,2003年7月18日04:31:32 GMT,David Lees 写道:^^^^^^^^^ .找到所有?例如:['foo','bar'] -Andrew.实际上,这是我要问的多行类型的文件失败.
如果您在开始时包含dotall标志,则可以工作
..还匹配\ n :( btw,(?si)会使它不敏感).
['foo \ nmumble','bar']
问候,
Bengt Richter
# 回答7


本格·里希特(Bengt Richter)写道:实际上,这是我要问的多行类型文件的失败.['bar']如果您在开始时包含dotall flag(?s),则可以使用.还匹配\ n:(btw,(?si)会使它不敏感). ['foo \ nmumble','bar']问,宾特·里希特(Bengt Richter)
我只是试图基于弗雷德里克的建议以及 NGT的
使用相同的输入文件.结果(在400k上循环200次
文件)是:
弗雷德里克(Fredrik),正则= 1.74003930667
弗雷德里克(Fredrik
Bengt,Regex = 1.45420158149
有趣的是,非regex方法的速度更快.
再次感谢.
大卫·李斯(David Lees)
代码(我尚未仔细检查)是:
导入,时间
Def TimeBengt(S,N):
p ='开始MSC(.*?)结束MSC'
rx = re.compile(p,re.dotall)
t0 = time.clock()
因为我在Xrange(n)中:
x = x = rx.findall(s)
t1 = time.clock()
返回T1-T0
DEF TIMEFREDRIK1(文本,n):
t0 = time.clock()
因为我在Xrange(n)中:
POS = 0
start = re.compile("开始")
end = re.compile(" end")
而1:
M = start.Search(文本,POS)
如果不是m:
休息
start = m.end()
m = end.Search(文本,开始)
如果不是m:
休息
end = m.start()
经过
pos = m.end()#前进
t1 = time.clock()
返回T1-T0
Def TimeFredrik(文本,n):
t0 = time.clock()
因为我在Xrange(n)中:
POS = 0
而1:
start = text.find("开始MSC",POS)
如果开始<0:
休息
开始 += 9
end = text.find(" end MSC",start)
如果结束<0:
休息
经过
pos =结束#前进
t1 = time.clock()
返回T1-T0
fh = open('scu.cfg','rb')
s = fh.read()
fh.close()
n = 200
打印" fredrik,regex =',timefredrik1(s,n)
打印"弗雷德里克,无正,timefredrik(s,n)
打印'bengt,regex =',timebengt(s,n)

标签: python

添加新评论