鱼C论坛

 找回密码
 立即注册
查看: 4904|回复: 15

[已解决]当匹配到一行数据是打印这行数据相邻的几行数据

[复制链接]
发表于 2016-2-6 12:34:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有文档1.txt如下:
@1234567890000
aaabbbcccdddeee
+
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
@23456789011111
bbbcccdddeeehhh
+
ssssssssssssssssssss
@33333333222222
cccaaadddeeebbb
+
gggggggggggggg
下面还有很多这样的数据.........

这个文件里(@1234567890000为第一行,jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj为第四行)为一个小组(后面还有很多这样的数据),当这个小组中的第二行满足条件有‘aaa’和‘bbb’时打印这个小组,同事写进文档2.txt。
最佳答案
2016-2-7 17:20:24
我实验过了,可以的,处理catrl + c什么的细节方面我就没弄了

代码如下,注释也写好了,不懂可以追问

  1. def obtenir_list(file_name): # 该函数用于获得原文件的内容
  2.     with open(file_name) as file:
  3.         return file.readlines()


  4. def validerTrue(list_test, site): # 用于确定是否每一组第二行含有'aaa'和'bbb'
  5.     string = list_test[site]
  6.     if ('aaa' in string) and ('bbb' in string):
  7.         return 1
  8.     return 0


  9. def writeintest(list_output, file_name): # 用于写入文件
  10.     with open(file_name,'w') as file:
  11.         file.writelines(list_output)

  12.    
  13. def outputLines(list_test, site): # 用于生成新的每一组需要保存的数据,返回一个字符串
  14.     list_site = [site - 1, site, site + 1, site + 2]
  15.     res = ''
  16.     for each_site in list_site:
  17.         res += list_test[each_site]
  18.     return res


  19. def main(file_name):
  20.     list_test = obtenir_list(file_name) # 获得原文件的内容
  21.    
  22.     # 每一组第二行相当于就是所有索引号是除以四以后余1的数
  23.     step = (i for i in range(len(list_test)) if i % 4 == 1 )
  24.     list_output = list() # 创建一个列表方便输出
  25.    
  26.     for site in step:
  27.         if validerTrue(list_test, site):
  28.             # 将确认满足条件的数据写入输出的列表
  29.             list_output.append(outputLines(list_test, site))

  30.     file_name = input('请输入输出的文件名:')
  31.     writeintest(list_output, file_name)

  32.     return 1
  33.    


  34. if __name__ == '__main__':
  35.     main('text.txt')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-2-6 14:30:22 | 显示全部楼层
你的问题还没表述清楚。。而且还有错字。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-6 18:23:57 | 显示全部楼层
你是不会正则语法还是不知道怎么实时调试?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-6 19:18:56 | 显示全部楼层
hldh214 发表于 2016-2-6 18:23
你是不会正则语法还是不知道怎么实时调试?

当匹配到第二行的时候不知道怎么把其它三行一起打印
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-6 19:34:50 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-6 19:18
当匹配到第二行的时候不知道怎么把其它三行一起打印

你用findall方法了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-6 20:38:36 | 显示全部楼层
hldh214 发表于 2016-2-6 19:34
你用findall方法了吗

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-6 21:08:13 | 显示全部楼层

那就是你的表达式有问题啦, 不然肯定能匹配到所有符合要求的字符串的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-6 23:20:28 | 显示全部楼层
hldh214 发表于 2016-2-6 21:08
那就是你的表达式有问题啦, 不然肯定能匹配到所有符合要求的字符串的

@1234567890000
aaabbbcccdddeee
+
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj

比如说我匹配到第二行,但是我想把这四行都写进新的文件2.txt中怎么弄?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-7 08:44:56 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-6 23:20
@1234567890000
aaabbbcccdddeee
+

修改正则表达式
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-7 17:20:24 | 显示全部楼层    本楼为最佳答案   
我实验过了,可以的,处理catrl + c什么的细节方面我就没弄了

代码如下,注释也写好了,不懂可以追问

  1. def obtenir_list(file_name): # 该函数用于获得原文件的内容
  2.     with open(file_name) as file:
  3.         return file.readlines()


  4. def validerTrue(list_test, site): # 用于确定是否每一组第二行含有'aaa'和'bbb'
  5.     string = list_test[site]
  6.     if ('aaa' in string) and ('bbb' in string):
  7.         return 1
  8.     return 0


  9. def writeintest(list_output, file_name): # 用于写入文件
  10.     with open(file_name,'w') as file:
  11.         file.writelines(list_output)

  12.    
  13. def outputLines(list_test, site): # 用于生成新的每一组需要保存的数据,返回一个字符串
  14.     list_site = [site - 1, site, site + 1, site + 2]
  15.     res = ''
  16.     for each_site in list_site:
  17.         res += list_test[each_site]
  18.     return res


  19. def main(file_name):
  20.     list_test = obtenir_list(file_name) # 获得原文件的内容
  21.    
  22.     # 每一组第二行相当于就是所有索引号是除以四以后余1的数
  23.     step = (i for i in range(len(list_test)) if i % 4 == 1 )
  24.     list_output = list() # 创建一个列表方便输出
  25.    
  26.     for site in step:
  27.         if validerTrue(list_test, site):
  28.             # 将确认满足条件的数据写入输出的列表
  29.             list_output.append(outputLines(list_test, site))

  30.     file_name = input('请输入输出的文件名:')
  31.     writeintest(list_output, file_name)

  32.     return 1
  33.    


  34. if __name__ == '__main__':
  35.     main('text.txt')
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
shuofxz + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-9 23:17:13 | 显示全部楼层
漆雕古代 发表于 2016-2-7 17:20
我实验过了,可以的,处理catrl + c什么的细节方面我就没弄了

代码如下,注释也写好了,不懂可以追问

感谢!我试一试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-9 23:23:49 | 显示全部楼层
hldh214 发表于 2016-2-7 08:44
修改正则表达式

a1.txt内容如下:
qwertyuiop
aaasdfgbbb
asdfghjkl
zxcvbnm

import re
x = open('F:/a1.txt','r')
x1 = open('F:/aa1.txt','w')
y = x.readlines()
r = r'aaa.+bbb'
c = [i for i in y if re.findall(r,i)]

x1.writelines(c)
x1.close()
求指点,帮忙修改一下,怎么样可以在匹配上的时候第二行,同时打印四行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-10 10:09:39 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-9 23:23
a1.txt内容如下:
qwertyuiop
aaasdfgbbb
  1. \w+\saaa.+bbb\s\w+\s\w+
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-10 11:05:15 | 显示全部楼层

\w后面的+号是代表重复一次或多次,还是代表行与行之间的相加。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-10 17:57:09 | 显示全部楼层
冬天的哈根达斯 发表于 2016-2-10 11:05
\w后面的+号是代表重复一次或多次,还是代表行与行之间的相加。

是代表一次或多次, 可以匹配成功吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-11 23:56:57 | 显示全部楼层
hldh214 发表于 2016-2-10 17:57
是代表一次或多次, 可以匹配成功吗

要用*号不能用+号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-19 15:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表