一个正则匹配的问题

huamihu 2014-02-10 10:05:46
我有若干段文本,用python逐行读取,我想搜索每一段的内容,凡是这一段有符合我需要搜索的字符串的,显示这一章的章名,请见下图


我的思路是这样的,
用for line in file: 先逐行读取文本;
用条件语句if 来判断"bbb"字符串的,如果找到的,显示该字符串所在章的章名,如“第一章”等。

请问应该怎么做?

...全文
186 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
panghuhu250 2014-02-12
  • 打赏
  • 举报
回复
re.findall
In [130]: pat = re.compile(u"^(第.章.*?$).*?bbb.*?", re.DOTALL|re.MULTILINE)

In [131]: s = u"""第一章 绪论
     ...: xxx ss sdd xx  bbb sdff sdd sdd
     ...: xlddl
     ...: sdlf;lflfllf bbb s,x,x,
     ...: 第二章 开始
     ...: xxx skdk sdjeo xpweo xmxie
     ...: skdk
     ...: 第三章 结束
     ...: sdldk 三大口大口塑料袋里三大口大口
     ...: 三大口大口bbb三大口大口
     ...: """

In [132]: print " ".join(re.findall(pat, s))
第一章 绪论 第二章 开始

In [133]: print "\n".join(re.findall(pat, s))
第一章 绪论
第二章 开始

In [134]: 
fly0snow 2014-02-12
  • 打赏
  • 举报
回复
引用 4 楼 panghuhu250 的回复:
re.findall
In [130]: pat = re.compile(u"^(第.章.*?$).*?bbb.*?", re.DOTALL|re.MULTILINE)

In [131]: s = u"""第一章 绪论
     ...: xxx ss sdd xx  bbb sdff sdd sdd
     ...: xlddl
     ...: sdlf;lflfllf bbb s,x,x,
     ...: 第二章 开始
     ...: xxx skdk sdjeo xpweo xmxie
     ...: skdk
     ...: 第三章 结束
     ...: sdldk 三大口大口塑料袋里三大口大口
     ...: 三大口大口bbb三大口大口
     ...: """

In [132]: print " ".join(re.findall(pat, s))
第一章 绪论 第二章 开始

In [133]: print "\n".join(re.findall(pat, s))
第一章 绪论
第二章 开始

In [134]: 
你这个是错误的,应该是第一章,第三章 正则可以换成 ^(第.章[^\n]*?$)(?:.(?!第.章))*?bbb 不过我在python里用正则匹配中文的时候总是有问题,在正则测试工具中可以匹配,但是在python中总是没有结果。不知道panghuhu250兄是怎么在python中匹配中文的,求指教
panghuhu250 2014-02-12
  • 打赏
  • 举报
回复
引用 5 楼 fly0snow 的回复:
[quote=引用 4 楼 panghuhu250 的回复:] re.findall
In [130]: pat = re.compile(u"^(第.章.*?$).*?bbb.*?", re.DOTALL|re.MULTILINE)

In [131]: s = u"""第一章 绪论
     ...: xxx ss sdd xx  bbb sdff sdd sdd
     ...: xlddl
     ...: sdlf;lflfllf bbb s,x,x,
     ...: 第二章 开始
     ...: xxx skdk sdjeo xpweo xmxie
     ...: skdk
     ...: 第三章 结束
     ...: sdldk 三大口大口塑料袋里三大口大口
     ...: 三大口大口bbb三大口大口
     ...: """

In [132]: print " ".join(re.findall(pat, s))
第一章 绪论 第二章 开始

In [133]: print "\n".join(re.findall(pat, s))
第一章 绪论
第二章 开始

In [134]: 
你这个是错误的,应该是第一章,第三章 正则可以换成 ^(第.章[^\n]*?$)(?:.(?!第.章))*?bbb 不过我在python里用正则匹配中文的时候总是有问题,在正则测试工具中可以匹配,但是在python中总是没有结果。不知道panghuhu250兄是怎么在python中匹配中文的,求指教[/quote] 多谢指正! 我常犯的错误是正则表达式和匹配的字符串的编码不一致。比如我的例子中pat和s都是unicode(开头的u)。如果把其中一个换成byte string的话(去掉开头的u),就没有匹配了。
ImN1 2014-02-11
  • 打赏
  • 举报
回复
补充一下楼上的 就是在一个循环里两个判断,第一个判断是否符合第几章这样的格式,是则赋值给title变量,否则进行第二个判断,是否有bbb在内,是则print title,否则不理会,进行下一个循环
huamihu 2014-02-11
  • 打赏
  • 举报
回复
谢谢fly兄和snmr兄, 实验成功了。 小弟新学编程,多谢回答
fly0snow 2014-02-11
  • 打赏
  • 举报
回复
设一个变量title,没读到章名,就存储到title里,如果遇到bbb,就把title打出来

37,742

社区成员

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

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