作者apua (Apua)
看板Python
标题Re: [问题] 关於List的问题
时间Sat Sep 17 19:56:50 2011
※ 引述《blackboy (黑男孩)》之铭言:
: 後来有想过用regular search的方式去判定该行是否有符合我需要的关键字,不过这样
: 我需要改成用回圈把list的每一行读出来後再用regular来比对。因为我不知道怎麽判
: 定回圈已经读到该List的最後一行。
其实你不用思考回圈是否读到最後一行,参考以下例子::
for line in open("FILE"): print line,
: 我原本的想法是假设回圈已经比对过List所有的字串後,没有找到我需要的关键字才
: 把整个List清空,不知道是否有比较好的解法来处理这个问题呢?
我看到你的code里有 `regex2` 这东西,不知道是不是自己写的?
建议用标准模组 `re` 来做regexp搜寻,各种功能都能轻易做到
: 我的Log类似像是底下这样:
: Tag
: str1
: str2
: str3
: Tag
: str4
: str5
: str6
: Tag
如果用 `re` 模组为例子:
>>> log
'Tag\nstr1\nstr2\nstr3\nTag\nstr4\nstr5\nstr6\nTag'
>>>
>>> import re
>>>
>>> m = re.search( '(?<=Tag\n).*?(?=Tag)' , log , re.S ) # a match object
>>> m.group(0)
'str1\nstr2\nstr3\n'
>>>
>>> m = re.findall( '(?<=Tag\n).*?(?=Tag)' , log , re.S ) # a list of string object
>>> m
['str1\nstr2\nstr3\n', 'str4\nstr5\nstr6\n']
>>>
>>> for m in re.finditer( '(?<=Tag\n).*?(?=Tag)' , log , re.S ):
... print m.group(0) # m is a match object
...
str1
str2
str3
str4
str5
str6
: 每个段落间会有固定的tag字串做为分隔,但是其中的字串行数不确定,我原先的做法
: 是先将全部的内容读入一个List内,然後用回圈一句一句读出来,如果遇到两个Tag包
: 起来的时候,就把里面的内容去filter,如果其中有一段是符合我的关键字,那麽我就
: 把这整段放到另一个List里面。
: 如果是用if str in list的方式,必须是完全符合那字串才会丢到另一个List内。
: 可是我有些关键字可能是在该行字串的其中一部分,那我就想说改用Regular的方式来
: 做filter。
事实上我不清楚你还想对捞出来的「区块」做什麽处理,但我相信regexp较直觉
re module的docs :
http://docs.python.org/library/re.html
我强烈建议你注意7.2.1. 那段中 `(?<=...)` 的用法说明
还有7.2.3. 那段中对各种tag的用法说明
Python的re强的很恐怖....
: Code大约像是这样,这是我一开始的写法。
: try:
: while True:
: line = fp.next()
: if regex2.search(line) and len(Error0) != 0: //抓到第一个tag
: for line in check: //check是我要筛选的关键字
: if line in Error0:
: content = content[:]+Error0[:]
: Error0 = []
: getContent = 0
: else:
: Error0 = []
: getContent = 0
这边可以写成这样::
for line in check: #其实我怀疑你line和check写颠倒了
if line in Error0: content += Error0
Error0, getContent = [], 0
: elif regex2.search(line) and len(Error0) == 0:
: getContent = 1
: elif not regex2.search(line) and getContent == 1:
: Error0.append(line)
: except StopIteration:
: pass
(实际上我看不太懂这段程式码在做什麽....orz)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 112.104.13.57