鱼C论坛

 找回密码
 立即注册
查看: 2201|回复: 7

[已解决]【求助】刚学了正则表达式,遇到了些问题,恳望指教

[复制链接]
发表于 2015-12-29 10:09:34 | 显示全部楼层 |阅读模式

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

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

x
有两个txt文件A和B

文件A的内容:
ID00023
ID00032

文件B的内容:
>ID00001 Tom
ABCDABCDABCDABCD
>ID00023 Aaron
ABCDABCDABCDABCD
>ID00002 Abner
ABCDABCDABCDABCD
>ID00032 Adolph
ABCDABCDABCDABCD
>ID00003 Adam
ABCDABCDABCDABCD
>ID00004 Adrian
ABCDABCDABCDABCD

根据A中的ID,用正则表达式提取文件B中相对应ID的详细信息,并写入文件C
产生如下结果

>ID00023 Aaron
ABCDABCDABCDABCD
>ID00032 Adolph
ABCDABCDABCDABCD
最佳答案
2015-12-29 18:06:42
hldh214 发表于 2015-12-29 16:57
遍历A的每一行直接用for循环,大胆的for each_line in fa:

正则适用于有规律但无法用字符串直接表达的。
这个程序不用正则就可以。
  1. temp1 = open('a.txt')
  2. temp2 = open('b.txt')
  3. file1 = list(temp1)
  4. file2 = list(temp2)
  5. c = []
  6. for a in range(len(file1)):
  7.     if file1[a][-1] == '\n':
  8.         file1[a] = file1[a][:-1]
  9.     for b in range(0, len(file2), 2):
  10.         if file1[a] in file2[b]:
  11.             c.append(file2[b])
  12.             c.append(file2[b + 1])
  13. temp3 = open('c.txt','w')
  14. temp3.writelines(c)
  15. temp1.close()
  16. temp2.close()
  17. temp3.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-29 11:26:32 | 显示全部楼层
1. 用for迭代出A里面的ID
2. 写正则表达式匹配B里面的内容并写入列表
3. 对列表进行for循环迭代查找ID,若匹配A里面的ID,则写入C
4. 不懂欢迎追问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-29 14:39:35 | 显示全部楼层
hldh214 发表于 2015-12-29 11:26
1. 用for迭代出A里面的ID
2. 写正则表达式匹配B里面的内容并写入列表
3. 对列表进行for循环迭代查找ID,若 ...

自己尝试写了下,还是搞不懂。。。:cry
import re
fa = open('E:\A.txt','r')
a = fa.readlines()
fa.close()
fb = open('E:\B.txt','r')
b = fb.readlines()
fb.close()
c=[]

for i in a:
    RE = re.compile(r'(>i.*?)>')#不知道怎么把表示文件A中每一行的变量i放入正则表达式里面,总是提示错误
    c.append(re.search(RE, b))

fc = open('E:\C.txt', 'w')
fc.writelines(c)
fc.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-29 16:57:27 | 显示全部楼层
socurel 发表于 2015-12-29 14:39
自己尝试写了下,还是搞不懂。。。
import re
fa = open('E:\A.txt','r')

遍历A的每一行直接用for循环,大胆的for each_line in fa:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-29 18:06:42 | 显示全部楼层    本楼为最佳答案   
hldh214 发表于 2015-12-29 16:57
遍历A的每一行直接用for循环,大胆的for each_line in fa:

正则适用于有规律但无法用字符串直接表达的。
这个程序不用正则就可以。
  1. temp1 = open('a.txt')
  2. temp2 = open('b.txt')
  3. file1 = list(temp1)
  4. file2 = list(temp2)
  5. c = []
  6. for a in range(len(file1)):
  7.     if file1[a][-1] == '\n':
  8.         file1[a] = file1[a][:-1]
  9.     for b in range(0, len(file2), 2):
  10.         if file1[a] in file2[b]:
  11.             c.append(file2[b])
  12.             c.append(file2[b + 1])
  13. temp3 = open('c.txt','w')
  14. temp3.writelines(c)
  15. temp1.close()
  16. temp2.close()
  17. temp3.close()
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
hldh214 + 1 + 1 支持,小程序不用正则便于理解,但是在大项目.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2015-12-30 04:59:48 | 显示全部楼层
本帖最后由 漆雕古代 于 2015-12-30 05:03 编辑
socurel 发表于 2015-12-29 14:39
自己尝试写了下,还是搞不懂。。。
import re
fa = open('E:\A.txt','r')


你readlines是返回一个列表,可以用for it in a遍历一次列表,至于正则表达式可以用%s来替代遍历的字符串。你可以这么尝试用这个正则:


r"%s",it

it是你遍历出来的字符串,不知道这样可不可以你试试?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-30 05:30:14 | 显示全部楼层
本帖最后由 漆雕古代 于 2015-12-30 05:31 编辑
socurel 发表于 2015-12-29 14:39
自己尝试写了下,还是搞不懂。。。
import re
fa = open('E:\A.txt','r')


我自己验证了一下,发现搞错了

格式应该这样

  1. a = '00330022'
  2. b = '00220033'
  3. c = [a,b]
  4. res =[]
  5. for it in c:
  6.         import re
  7.         res = res + (re.findall(r'%s'%it,'00330022003300220022003300220033'))
  8. print(res)
复制代码




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2016-1-25 08:41:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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