如何获取字符串在文本中的位置?

kenbeyond 2009-04-06 10:32:59
我是一个新手

我想处理一个Txt文件,这个txt文件里面有5篇文章,每篇文章的标题开始处都有一个记号,比如“标题:”

现在我想做的就是获取这些“标题:”的位置,并获取其后的标题名称

然后将这些标题的位置与名称写入另外一个txt文件中

其中标题位置是指“标题:”之前所有字符的数量,包括标点。

能否给点提示?

谢谢了
...全文
201 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
DDGG 2009-04-09
  • 打赏
  • 举报
回复
如你最初所想的,可以用split(),也可以每次读一段。
不考虑内存问题的话就这样,比较简洁明了:

#coding: gbk
import re

SEP = "@"

s = """@怎么才能使程序一启动就隐藏窗口
建立日期: 2001年1月14日 最后修改日期:2001年6月19日
所属类别:C/C++ - 窗体与菜单


@如何获取字符串在文本中的位置?
建立日期: 2009年4月16日 最后修改日期:2001年6月19日
所属类别:脚本语言(Perl ,Python)
"""

paras = s.split(SEP)
out_lines = ["[Bookmarks]"]
idx = 0
pos = 0
for para in paras:
if para:
m = re.match("^(.*)$", para, re.M)
if m:
topic = m.group(0)
out_lines.append("BookmarkName%d=%s" % (idx, topic))
out_lines.append("BookmarkPos%d=%d" % (idx, pos + len(SEP)))
idx += 1
pos += len(para) + len(SEP)
out = "\n".join(out_lines)
print out


写文件可以用
file("c:\\bookmark.txt", "w").write(out)
kenbeyond 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 boyz2men 的回复:]
那就个屁了

我觉得既然有rss全文输出还是有空研究下rss输出的格式 然后分开存成个别的文章比较好,省了copy past的时间 何必算那数不清楚的标签。
[/Quote]
因为我要手动筛选一下,只有1/10的文章是有用的,其他都mark it all read了
我只挑有用的文章读
boyz2men 2009-04-08
  • 打赏
  • 举报
回复
文章里无法保证完全没有半角符号 你怎么办???
kenbeyond 2009-04-08
  • 打赏
  • 举报
回复
好像又不是这个问题,似乎在计算字符的时候,中英文字符的问题,一个中文算2个字符的,好像,所以书签与手机看书程序生成的位置大体相差一倍
boyz2men 2009-04-08
  • 打赏
  • 举报
回复
那就个屁了

我觉得既然有rss全文输出还是有空研究下rss输出的格式 然后分开存成个别的文章比较好,省了copy past的时间 何必算那数不清楚的标签。
kenbeyond 2009-04-08
  • 打赏
  • 举报
回复
问题解决了
import re
BookmarkPos=0
BookmarkNo=0
BookmarkName=""
f=open("0401.ibi","w")
f.write("[Progress]\n")
f.write("[Bookmarks]\n")

s=file("0401.txt").read()

regex=re.compile('@(.*?)\s')
iterator=regex.finditer(s)
for m in iterator:
BookmarkPos=m.start()
f.write( "BookmarkName"+str(BookmarkNo)+"="+m.group()[0:18].replace("\n","")+"\n")
f.write( "BookmarkPos"+str(BookmarkNo)+"="+str(BookmarkPos)+"\n")
BookmarkNo=BookmarkNo+1

f.write("BookmarkNum="+str(BookmarkNo))
f.close()

不过我发现生成的书签放进手机里面不能用,死机了,囧。。。
原来这个手机的书签的位置不是这么定义的,应该是那个手机屏幕最左上方的字开始算的
这样我要算一下一个屏幕容纳多少字,好像还是不确定的,因为有换行
所以说,如果我要选择那篇文章,我要计算这篇文章落在第几个屏幕中,然后定位那个屏幕最左上方的字符是第几个字符
囧。。。
boyz2men 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 kenbeyond 的回复:]
引用 11 楼 boyz2men 的回复:

插一句 楼主google reader 内容怎么取得?直接抓网页? 离线版的sqlite记录里记得好像有分好的标题和内容吧。

你就不要指望我懂得会用脚本抓取Google Reader里面的内容了,我手动一篇一篇复制粘贴的,囧
[/Quote]

那你还是装那个gear什么玩意的让google reader可以离线吧 所有没看过的内容都在sqlite的table里 好像是xml格式 我不会玩。你研究下贴代码。
sqlite肯定比抓网页容易多了。


kenbeyond 2009-04-08
  • 打赏
  • 举报
回复
我初学python,试着写了一下,请帮忙看一下思路是不是正确,是不是有好的方法

BookmarkNo=-1
BookmarkPos=0
BookmarkName=""
f=open("0401.ibi","w")
f.write("[Bookmarks]\n")
for line in open("0401.txt"):
i=line.find("@",0,3)
BookmarkPos=BookmarkPos+len(line)
if i<>-1:
BookmarkNo=BookmarkNo+1
f.write( "BookmarkName"+str(BookmarkNo)+"="+str(line[1:30])+"\n")
f.write( "BookmarkPos"+str(BookmarkNo)+"="+str(BookmarkPos)+"\n")

f.write("BookmarkNum="+str(BookmarkNo))
f.close()
kenbeyond 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 boyz2men 的回复:]
插一句 楼主google reader 内容怎么取得?直接抓网页? 离线版的sqlite记录里记得好像有分好的标题和内容吧。
[/Quote]
你就不要指望我懂得会用脚本抓取Google Reader里面的内容了,我手动一篇一篇复制粘贴的,囧
boyz2men 2009-04-08
  • 打赏
  • 举报
回复
插一句 楼主google reader 内容怎么取得?直接抓网页? 离线版的sqlite记录里记得好像有分好的标题和内容吧。
kenbeyond 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xsir317 的回复:]
标题位置么,你可以抓标题前面的所有文字,然后看看长度就可以了。。。
[/Quote]
我发现还是叮叮当当的方法高效,我就是不知道如何抓取前面的所有文字?请指教
kenbeyond 2009-04-07
  • 打赏
  • 举报
回复
情况是这样的,我的手机上面有个看书的软件,支持书签(是一个文本文件,和txt文件同名,后缀不同),我平时google reader的文章就复制粘贴到一个txt文件里面,用这个手机软件看
我想写一个书签的生成脚本,但是无奈刚学python,不会

我的想法是这样的,把google reader的文章拷贝到txt中的时候,在文章开头手动做一个标记,比如@或者其他符号
然后根据这个符号来判定文章标题的位置

书签的格式是这样的
[Bookmarks]
BookmarkName0=中国股市股价上涨的理由何在?
BookmarkPos0=30
BookmarkName1=左小蕾:10年磨一剑 创业板一定
BookmarkPos1=4253
BookmarkName2=一个仇富的社会是没有前途的社?
BookmarkPos2=6899
BookmarkName3=万通地产:优而美的商业哲学
BookmarkPos3=14505
BookmarkNum=3

我是想写这个书签脚本,所以才这几天看python的,所以真的很菜。。
lixq2000 2009-04-07
  • 打赏
  • 举报
回复
直接从全文里面匹配不是更好?
xsir317 2009-04-07
  • 打赏
  • 举报
回复
请给个sample文件好么?

“其后的标题名称”是那一段?

两个"标题:"中间的都是?

还是"标题:"后面一直到一行结束?

标题位置么,你可以抓标题前面的所有文字,然后看看长度就可以了。。。
DDGG 2009-04-07
  • 打赏
  • 举报
回复
#coding: gbk
import re

s = """编号:QA003762 标题:怎么才能使程序一启动就隐藏窗口
建立日期: 2001年1月14日 最后修改日期:2001年6月19日
所属类别:C/C++ - 窗体与菜单


编号:QA009406 标题:如何获取字符串在文本中的位置?
建立日期: 2009年4月16日 最后修改日期:2001年6月19日
所属类别:脚本语言(Perl ,Python)
"""

m = re.findall("^(.*?)标题:(.*?)$", s, re.M)
print m
for left, right in m:
print len(left), right


读入文件到变量s:
s = file("c:\\1.txt").read()
kenbeyond 2009-04-07
  • 打赏
  • 举报
回复
谢谢,但是还是有一个问题
就是我要的位置不是单指从这一行开始的位置,而是从文章开始到这个位置时所有字符的长度
不知道这样能不能用正则?

还是说
for line in open("1.txt")
这样逐行查找过去并对字符进行计数?

不知道这样是不是很笨?
kenbeyond 2009-04-06
  • 打赏
  • 举报
回复
谢谢叮叮当当

不过我希望是用python,因为刚搭建好python环境
kenbeyond 2009-04-06
  • 打赏
  • 举报
回复
网上搜了一下,好像可以用正则表达式?
re.split()可以返回一个列表?
具体怎么用呢?
我是说,是不是要一行一行处理?还是可以对整个文件进行处理?

实在是很菜。。
DDGG 2009-04-06
  • 打赏
  • 举报
回复
可以使用正则表达式对具有“标题:”的特征行进行搜索,找到匹配项时便可连“标题”的位置以及其后的标题名称一并获得。

比如用Perl来写可能就象这样:

$m ~= /^(.*?)标题:(.*?)$//mig;

37,741

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧