鱼C论坛

 找回密码
 立即注册
查看: 1591|回复: 14

[已解决]提取指定字符前后内容的代码需要小改进,谢谢

[复制链接]
发表于 2021-11-19 16:29:27 | 显示全部楼层 |阅读模式
10鱼币
待被提取文件B.txt内容 如下:
AAA#BBB.
CCC#DDDD.
A&A:Yn#B&B:Yn.
C&C:Yn#D&D:Yn-YIN T0BCI NEREIDUL.
B&B:Yn#F&F:Yn.
G&G:Yn#①H&H:Yn②DDDDDDD.
其中符号“#”前是词,后面内容是其释义。

最终目标是:我想提取带有"&"符号词的释义内容中一些指定的词。具体实现时有几个小要求:

具体要求是:

1.我想代码读取我指定一个文件A.txt里的带有“&”符号的词做提取,这个A.txt里每一个词一行的格式。例如,A.txt内容是
A&A:Yn
C&C:Yn;那么代码就找这几个词在B.txt里的释义内容。A.txt中的词不在B.txt话 需要全部另成一个“未登录词”集锦的txt。

2.提取时释义内容时不全提取,需要提取某些字符串前或后的带有符号“&”的词。具体而言:

        2.1:B.txt内容中第三行数据的A&A:Yn词需要提取其B&B:Yn释义。因为它俩直接对应,释义内容中也没别的干扰词。若有则跳转下一个提取模式。
        2.2:提取的数据中有重合关系,想分开提取。具体而言:原始文件中,”A&A:Yn“提取到了{A&A:Yn#B&B:Yn},”B&B:Yn“也可以提取到{B&B:Yn#F&F:Yn},那么意思是,A=B,B=C 所以A=C;我想得到:{A&A:Yn#B&B:Yn},{B&B:Yn#F&F:Yn}这样的一列排序。能实现吗?
        2.3:像原始文件里第六行所示,一些词与指定数字后面的词有关系,我想提取它。例如,第六行提取结果是{G&G:Yn#①H&H:Yn},不提取②后面的词,因为其没有符号”&“。

目前实现的代码是(论坛友帮助的):

def get(data):
    if "&" not in data or "#" not in data:
        return
    k, v = data.split("#")
    if " " not in v:
        res = {k.strip():v.strip()}
    elif "-YIN T0BCI NEREIDUL" in v:
        res = {k.strip():v[:v.find("-YIN T0BCI NEREIDUL")].strip()}
    elif "-GI LABLAJV UJE" in v:
        res = {k.strip():v[:v.find("-GI LABLAJV UJE")].strip()}
    elif "-UN HUNDUDHEL" in v:
        res = {k.strip():v[:v.find("-UN HUNDUDHEL")].strip()}
    elif "UGEI" in v:
        res = {k.strip():v[v.find("UGEI")+4:].strip()}
    elif "BVSV" in v:
        res = {k.strip():v[v.find("BVSV")+4:].strip()}
    else:
        return
    return res


if __name__ == "__main__":
    text = """AAA#BBB.
CCC#DDDD.
A&A:Yn#B&B:Yn.
C&C:Yn#D&D:Yn-YIN T0BCI NEREIDUL.
B&B:Yn#F&F:Yn.
G&G:Yn#①H&H:Yn②DDDDDDD."""
    for i in text.splitlines():
        if get(i):
            print(get(i))
   
需要添加上述具体要求1,2的内容,需要大家的支持,谢谢哒,期待您的回信。

最佳答案
2021-11-19 16:29:28
本帖最后由 lightninng 于 2021-11-20 04:54 编辑
Amgalang 发表于 2021-11-20 00:41
正在学习当中,但是目前在赶一个小作业,做不出来了,若您能实现就太好了,期待回复。

按个人理解的意思写了出来,感觉不如意,但是凑合用吧。
注:代码里面
dictionary={key.strip():[item.strip(".") for item in re.split("[①②]",value.strip()) if item] for key,value in [line.split("#") for line in string.splitlines()]}
这一句中的"[①②]"这个字符串要把多个释义的所有出现过的数字标号都放进去,你给的里面只出现了①②,所以我只加了①②

你需要的输出在output字典里面,大概这样
  1. {'A&A:Yn': ['A&A:Yn#B&B:Yn', 'B&B:Yn#F&F:Yn'],
  2.   'C&C:Yn': ['C&C:Yn#D&D:Yn-YIN T0BCI NEREIDUL'],
  3.   'G&G:Yn': ['G&G:Yn#H&H:Yn'],
  4.   'd&d': []}
复制代码
未登录词在missing_word列表里面,大概这样
  1. ['d&d']
复制代码

只能帮你到这里了~~
代码如下:
  1. import time
  2. import re

  3. def get_dictionary(string):
  4.     #函数用于从字典文本中获取词和对应的释义
  5.     if "&" not in string or "#" not in string:
  6.         return {}
  7.    
  8.     dictionary={key.strip():[item.strip(".") for item in re.split("[①②]",value.strip()) if item] for key,value in [line.split("#") for line in string.splitlines()]}
  9.     return dictionary


  10. def get_interpretation(word,dictionary,result):
  11.     #函数用于在dictionary中查询word的释义,结果添加到result列表中
  12.     interpre_list = dictionary.get(word,[])
  13.     if not interpre_list:
  14.         return []
  15.    
  16.     for item in interpre_list:
  17.         if "&" in item:
  18.             result.append(f"{word}#{item}")
  19.             get_interpretation(item,dictionary,result)

  20. if __name__ == "__main__":
  21.     #textA为A.txt内容,textB同理
  22.     textA="""A&A:Yn
  23. C&C:Yn
  24. G&G:Yn
  25. d&d"""

  26.     textB = """AAA#BBB.
  27. CCC#DDDD.
  28. A&A:Yn#B&B:Yn.
  29. C&C:Yn#D&D:Yn-YIN T0BCI NEREIDUL.
  30. B&B:Yn#F&F:Yn.
  31. G&G:Yn#①H&H:Yn②DDDDDDD."""
  32.    
  33.     #从字符串中获kye为词和value其对应的所有释义的列表的字典
  34.     dictionary=get_dictionary(textB)
  35.    
  36.     #控制台打印获取到的字典内容
  37.     print("字典内容为:")
  38.     for k,v in dictionary.items():
  39.         print(f"{k}:{v}")

  40.     #获取释义
  41.     output={}#存放查询结果:key为查询的词,value为查询到的所有释义(包含等价词义)
  42.     for word in textA.splitlines():
  43.         if "&" in word:
  44.             output[word]=[]
  45.             get_interpretation(word,dictionary,output[word])

  46.     #控制台打印输出结果
  47.     missing_word =[]  #存放未登录词
  48.     print("查询结果为:")
  49.     for key,value in output.items():
  50.         if not value:
  51.             missing_word.append(key) #满足需求1
  52.         else:
  53.             print(f"{key}释义:{str(value)}")

  54.     #控制台打印输出未登录词
  55.     print(f"未登录词条:\n{missing_word}")
复制代码


运行后控制台结果:
  1. 字典内容为:
  2. AAA:['BBB']
  3. CCC:['DDDD']
  4. A&A:Yn:['B&B:Yn']
  5. C&C:Yn:['D&D:Yn-YIN T0BCI NEREIDUL']
  6. B&B:Yn:['F&F:Yn']
  7. G&G:Yn:['H&H:Yn', 'DDDDDDD']
  8. 查询结果为:
  9. A&A:Yn释义:['A&A:Yn#B&B:Yn', 'B&B:Yn#F&F:Yn']
  10. C&C:Yn释义:['C&C:Yn#D&D:Yn-YIN T0BCI NEREIDUL']
  11. G&G:Yn释义:['G&G:Yn#H&H:Yn']
  12. 未登录词条:
  13. ['d&d']
复制代码

最佳答案

查看完整内容

按个人理解的意思写了出来,感觉不如意,但是凑合用吧。 注:代码里面 dictionary={key.strip():",value.strip()) if item] for key,value in [line.split("#") for line in string.splitlines()]} 这一句中的"[①②]"这个字符串要把多个释义的所有出现过的数字标号都放进去,你给的里面只出现了①②,所以我只加了①② 你需要的输出在output字典里面,大概这样 未登录词在missing_word列表里面,大概这样 只能帮你到这 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-19 16:29:28 | 显示全部楼层    本楼为最佳答案   
本帖最后由 lightninng 于 2021-11-20 04:54 编辑
Amgalang 发表于 2021-11-20 00:41
正在学习当中,但是目前在赶一个小作业,做不出来了,若您能实现就太好了,期待回复。

按个人理解的意思写了出来,感觉不如意,但是凑合用吧。
注:代码里面
dictionary={key.strip():[item.strip(".") for item in re.split("[①②]",value.strip()) if item] for key,value in [line.split("#") for line in string.splitlines()]}
这一句中的"[①②]"这个字符串要把多个释义的所有出现过的数字标号都放进去,你给的里面只出现了①②,所以我只加了①②

你需要的输出在output字典里面,大概这样
  1. {'A&A:Yn': ['A&A:Yn#B&B:Yn', 'B&B:Yn#F&F:Yn'],
  2.   'C&C:Yn': ['C&C:Yn#D&D:Yn-YIN T0BCI NEREIDUL'],
  3.   'G&G:Yn': ['G&G:Yn#H&H:Yn'],
  4.   'd&d': []}
复制代码
未登录词在missing_word列表里面,大概这样
  1. ['d&d']
复制代码

只能帮你到这里了~~
代码如下:
  1. import time
  2. import re

  3. def get_dictionary(string):
  4.     #函数用于从字典文本中获取词和对应的释义
  5.     if "&" not in string or "#" not in string:
  6.         return {}
  7.    
  8.     dictionary={key.strip():[item.strip(".") for item in re.split("[①②]",value.strip()) if item] for key,value in [line.split("#") for line in string.splitlines()]}
  9.     return dictionary


  10. def get_interpretation(word,dictionary,result):
  11.     #函数用于在dictionary中查询word的释义,结果添加到result列表中
  12.     interpre_list = dictionary.get(word,[])
  13.     if not interpre_list:
  14.         return []
  15.    
  16.     for item in interpre_list:
  17.         if "&" in item:
  18.             result.append(f"{word}#{item}")
  19.             get_interpretation(item,dictionary,result)

  20. if __name__ == "__main__":
  21.     #textA为A.txt内容,textB同理
  22.     textA="""A&A:Yn
  23. C&C:Yn
  24. G&G:Yn
  25. d&d"""

  26.     textB = """AAA#BBB.
  27. CCC#DDDD.
  28. A&A:Yn#B&B:Yn.
  29. C&C:Yn#D&D:Yn-YIN T0BCI NEREIDUL.
  30. B&B:Yn#F&F:Yn.
  31. G&G:Yn#①H&H:Yn②DDDDDDD."""
  32.    
  33.     #从字符串中获kye为词和value其对应的所有释义的列表的字典
  34.     dictionary=get_dictionary(textB)
  35.    
  36.     #控制台打印获取到的字典内容
  37.     print("字典内容为:")
  38.     for k,v in dictionary.items():
  39.         print(f"{k}:{v}")

  40.     #获取释义
  41.     output={}#存放查询结果:key为查询的词,value为查询到的所有释义(包含等价词义)
  42.     for word in textA.splitlines():
  43.         if "&" in word:
  44.             output[word]=[]
  45.             get_interpretation(word,dictionary,output[word])

  46.     #控制台打印输出结果
  47.     missing_word =[]  #存放未登录词
  48.     print("查询结果为:")
  49.     for key,value in output.items():
  50.         if not value:
  51.             missing_word.append(key) #满足需求1
  52.         else:
  53.             print(f"{key}释义:{str(value)}")

  54.     #控制台打印输出未登录词
  55.     print(f"未登录词条:\n{missing_word}")
复制代码


运行后控制台结果:
  1. 字典内容为:
  2. AAA:['BBB']
  3. CCC:['DDDD']
  4. A&A:Yn:['B&B:Yn']
  5. C&C:Yn:['D&D:Yn-YIN T0BCI NEREIDUL']
  6. B&B:Yn:['F&F:Yn']
  7. G&G:Yn:['H&H:Yn', 'DDDDDDD']
  8. 查询结果为:
  9. A&A:Yn释义:['A&A:Yn#B&B:Yn', 'B&B:Yn#F&F:Yn']
  10. C&C:Yn释义:['C&C:Yn#D&D:Yn-YIN T0BCI NEREIDUL']
  11. G&G:Yn释义:['G&G:Yn#H&H:Yn']
  12. 未登录词条:
  13. ['d&d']
复制代码

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

使用道具 举报

 楼主| 发表于 2021-11-19 16:33:49 | 显示全部楼层
因为等级关系,最多只能悬赏10鱼币,所以大家见谅,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-19 23:27:39 | 显示全部楼层
Amgalang 发表于 2021-11-19 16:33
因为等级关系,最多只能悬赏10鱼币,所以大家见谅,谢谢

建议楼主上真实场景里面的文件内容,你这个文本感觉像是自己编的,让人摸不着头脑,提的需求,也不是说看不懂,大多数人的感觉是太长不看吧。想办法用最少的语言把事情说清楚,仅个人建议,如有冒犯,多包涵~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-20 00:12:21 | 显示全部楼层
lightninng 发表于 2021-11-19 23:27
建议楼主上真实场景里面的文件内容,你这个文本感觉像是自己编的,让人摸不着头脑,提的需求,也不是说看 ...

谢谢您的回复,真实场景里的语料因为不是汉语的所以写出来字符会更长且相对较乱,所以我编了这个语料。您说到点儿上了,确实内容有点多,我会努力修改的,也希望您有空时 帮改进下 谢谢哒。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 00:31:18 | 显示全部楼层
Amgalang 发表于 2021-11-20 00:12
谢谢您的回复,真实场景里的语料因为不是汉语的所以写出来字符会更长且相对较乱,所以我编了这个语料。您 ...


字符串查找问题的终极工具就是正则表达式,虽然没太看明白你的意思,但是感觉上你说的问题应该可以用正则表达式来处理,百度学习一下没有坏处,因为平时 Python中字符串相关处理是一个非常常见的场景,如果能活用正则表达式,这类问题很容,可能就是一两句代码的事情
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-20 00:41:47 | 显示全部楼层
lightninng 发表于 2021-11-20 00:31
字符串查找问题的终极工具就是正则表达式,虽然没太看明白你的意思,但是感觉上你说的问题应该可以用正 ...

正在学习当中,但是目前在赶一个小作业,做不出来了,若您能实现就太好了,期待回复。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 00:51:11 | 显示全部楼层
Amgalang 发表于 2021-11-20 00:41
正在学习当中,但是目前在赶一个小作业,做不出来了,若您能实现就太好了,期待回复。

想要解决实际问题,还是上实际的B.txt内容吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 06:51:47 | 显示全部楼层
因为有360行,或者更多行业,
一个人也就熟悉或者接触一两个行业,其他的就隔着山。
即时你说破天,别人还是不懂。
最简单之法就是列出各种情况,标出在各种情况之下所需数据。
最后上点真是数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 06:57:31 | 显示全部楼层
  1. class Solution:
  2.     def __init__(self):
  3.         self.res = []

  4.     def refresh(self):
  5.         ks, vs = [], []
  6.         for r in self.res:
  7.             ks += r.keys()
  8.             vs += r.values()
  9.         while True:
  10.             for v in vs:
  11.                 if v in ks:
  12.                     for r in self.res:
  13.                         if v in r.keys() and len(r) == 1:
  14.                             d = r.copy()
  15.                             self.res.remove(r)
  16.                             break
  17.                     for r in self.res:
  18.                         if v in r.values():
  19.                             r.update(d)
  20.                             break
  21.                     ks.remove(v)
  22.                     break
  23.             else:
  24.                 break
  25.                
  26.     def get(self, data):
  27.         for i in data:
  28.             if "&" not in i or "#" not in i:
  29.                 continue
  30.             k, v = i.replace(".", "").split("#")
  31.             if "①" in v:
  32.                 v = v.replace("①", "**").replace("②", "**").replace("③", "**").replace("④", "**").replace("⑤", "**")
  33.                 v = [i for i in v.split("**") if "&" in i][0]
  34.             if " " not in v:
  35.                 r = {k.strip():v.strip()}
  36.             elif "-YIN T0BCI NEREIDUL" in v:
  37.                 r = {k.strip():v[:v.find("-YIN T0BCI NEREIDUL")].strip()}
  38.             elif "-GI LABLAJV UJE" in v:
  39.                 r = {k.strip():v[:v.find("-GI LABLAJV UJE")].strip()}
  40.             elif "-UN HUNDUDHEL" in v:
  41.                 r = {k.strip():v[:v.find("-UN HUNDUDHEL")].strip()}
  42.             elif "UGEI" in v:
  43.                 r = {k.strip():v[v.find("UGEI")+4:].strip()}
  44.             elif "BVSV" in v:
  45.                 r = {k.strip():v[v.find("BVSV")+4:].strip()}
  46.             else:
  47.                 continue
  48.             if r not in self.res:
  49.                 self.res.append(r)
  50.         self.refresh()
  51.         return self.res
  52.             
  53.             
  54. if __name__ == "__main__":
  55.     text1 = """AAA#BBB.
  56. CCC#DDDD.
  57. CINGGIS&HAGAN:Yn#GAR-VN&USUG:Yn.
  58. SINJI&CINAR:Yn#AGVLA-YIN&0R0I:Yn-YIN T0BCI NEREIDUL.
  59. OL&H0G0LA:Yn#EMEGE&EJI:Yn-GI LABLAJV UJE.
  60. BVSIGV&TURGEN:Yn#CAGAN&IDEGE:Yn-UN HUNDUDHEL.
  61. LABDAGVN&T0GTAGVN:Ya#CAGAN UGEI GALTV&AGVLA:Yn.
  62. G0Y0&SAYIHAN:Ya#JUI BVSV NEYIGEM&JIRVMTV:Ya.
  63. AAA&AA:Yn#BBB&BB:Yn.
  64. BBB&BB:Yn#CCC&CC:Yn.
  65. CCC&CC:Yn#DDD&DD:Yn."""
  66.     s = Solution()
  67.     result1 = s.get(text1.splitlines())
  68.     print(result1)
  69.     print("-----选择文件-----")
  70.    
  71.     f = open("test.txt", "r", encoding="utf-8")
  72.     text2 = f.readlines()
  73.     f.close()
  74.     s = Solution()
  75.     result2 = s.get(text2)
  76.     print(result2)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 07:01:30 From FishC Mobile | 显示全部楼层
我刚刚回复了,应该就是你想要的结果,好像在审核。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-20 07:31:11 | 显示全部楼层
lightninng 发表于 2021-11-20 01:41
按个人理解的意思写了出来,感觉不如意,但是凑合用吧。
注:代码里面
dictionary={key.strip():",valu ...

早上好,跟您不仅学到了代码也学到了一股认真,细致的态度,收到您的代码了,正在实验,真心感谢您,wish you have a nice day
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-20 07:32:48 | 显示全部楼层
kaohsing 发表于 2021-11-20 06:51
因为有360行,或者更多行业,
一个人也就熟悉或者接触一两个行业,其他的就隔着山。
即时你说破天,别人 ...

就是呢,我通过这两次提问 学到了,以后会按您说的办,这样会省很多时间,谢谢指点和帮助,wish you have a nice day
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-20 07:33:58 | 显示全部楼层
qq1151985918 发表于 2021-11-20 07:01
我刚刚回复了,应该就是你想要的结果,好像在审核。

哈哈哈,还以为您不继续帮了,期待您发的内容,wish you have a nice day
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 17:56:48 | 显示全部楼层
Amgalang 发表于 2021-11-20 07:33
哈哈哈,还以为您不继续帮了,期待您发的内容,wish you have a nice day

没怎么在线,这几天工作也比较忙。审核已经过了,自己看看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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