|
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的内容,需要大家的支持,谢谢哒,期待您的回信。
本帖最后由 lightninng 于 2021-11-20 04:54 编辑
按个人理解的意思写了出来,感觉不如意,但是凑合用吧。
注:代码里面
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字典里面,大概这样
- {'A&A:Yn': ['A&A:Yn#B&B:Yn', 'B&B:Yn#F&F:Yn'],
- 'C&C:Yn': ['C&C:Yn#D&D:Yn-YIN T0BCI NEREIDUL'],
- 'G&G:Yn': ['G&G:Yn#H&H:Yn'],
- 'd&d': []}
复制代码未登录词在missing_word列表里面,大概这样
只能帮你到这里了~~
代码如下:
- import time
- import re
- def get_dictionary(string):
- #函数用于从字典文本中获取词和对应的释义
- if "&" not in string or "#" not in string:
- return {}
-
- 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()]}
- return dictionary
- def get_interpretation(word,dictionary,result):
- #函数用于在dictionary中查询word的释义,结果添加到result列表中
- interpre_list = dictionary.get(word,[])
- if not interpre_list:
- return []
-
- for item in interpre_list:
- if "&" in item:
- result.append(f"{word}#{item}")
- get_interpretation(item,dictionary,result)
- if __name__ == "__main__":
- #textA为A.txt内容,textB同理
- textA="""A&A:Yn
- C&C:Yn
- G&G:Yn
- d&d"""
- textB = """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."""
-
- #从字符串中获kye为词和value其对应的所有释义的列表的字典
- dictionary=get_dictionary(textB)
-
- #控制台打印获取到的字典内容
- print("字典内容为:")
- for k,v in dictionary.items():
- print(f"{k}:{v}")
- #获取释义
- output={}#存放查询结果:key为查询的词,value为查询到的所有释义(包含等价词义)
- for word in textA.splitlines():
- if "&" in word:
- output[word]=[]
- get_interpretation(word,dictionary,output[word])
- #控制台打印输出结果
- missing_word =[] #存放未登录词
- print("查询结果为:")
- for key,value in output.items():
- if not value:
- missing_word.append(key) #满足需求1
- else:
- print(f"{key}释义:{str(value)}")
- #控制台打印输出未登录词
- print(f"未登录词条:\n{missing_word}")
复制代码
运行后控制台结果:
- 字典内容为:
- 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']
- 查询结果为:
- A&A:Yn释义:['A&A:Yn#B&B:Yn', 'B&B:Yn#F&F:Yn']
- C&C:Yn释义:['C&C:Yn#D&D:Yn-YIN T0BCI NEREIDUL']
- G&G:Yn释义:['G&G:Yn#H&H:Yn']
- 未登录词条:
- ['d&d']
复制代码
|
最佳答案
查看完整内容
按个人理解的意思写了出来,感觉不如意,但是凑合用吧。
注:代码里面
dictionary={key.strip():",value.strip()) if item] for key,value in [line.split("#") for line in string.splitlines()]}
这一句中的"[①②]"这个字符串要把多个释义的所有出现过的数字标号都放进去,你给的里面只出现了①②,所以我只加了①②
你需要的输出在output字典里面,大概这样
未登录词在missing_word列表里面,大概这样
只能帮你到这 ...
|