鱼C论坛

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

[已解决]提取指定字符串中间的字符求助,谢谢

[复制链接]
发表于 2021-11-17 08:32:21 | 显示全部楼层 |阅读模式

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

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

x
早上好,我有一个文本文档txt想从其中提取指定字符中间或前面的的词,希望大佬们练练手帮我一下,谢谢。

文件内容如:
AAA#BBB.
CCC#DDDD.
CINGGIS&HAGAN:Yn#GAR-VN&USUG:Yn.
SINJI&CINAR:Yn#AGVLA-YIN&0R0I:Yn-YIN T0BCI NEREIDUL.
OL&H0G0LA:Yn#EMEGE&EJI:Yn-GI LABLAJV UJE.
BVSIGV&TURGEN:Yn#CAGAN&IDEGE:Yn-UN HUNDUDHEL.
LABDAGVN&T0GTAGVN:Ya#CAGAN UGEI GALTV&AGVLA:Yn.
G0Y0&SAYIHAN:Ya#JUI BVSV NEYIGEM&JIRVMTV:Ya.

这个文件中 # 符号的前面是词后面是其释义
我想先找到有&的词,意思是不考虑文件中的AAA#BBB和CCC#DDDD这种没有&符号的词,只考虑有&符号而且是#前面的词。
1.然后第一个提取的模式是:一行内有两个或多个带有&符号的词,但是若除了带有&号的词外 有别的词那就不提取。提取结果是:CINGGIS&HAGAN:Yn#GAR-VN&USUG:Yn.而不是SINJI&CINAR:Yn#AGVLA-YIN&0R0I:Yn-YIN T0BCI NEREIDUL.因为后一行中除了带有&符号的词外还有不带&的词。
2.第二个提取模式是:带有&符号的词释义内容中“Yn-YIN T0BCI NEREIDUL”字符前面的带有&号的词。例如,文件中第四行。
3.第三个提取模式是:带有&符号的词释义内容中“-GI LABLAJV UJE”字符前面的带有&号的词。例如,文件中第五行。
4.第四个模式是:带有&符号的词释义内容中“-UN HUNDUDHEL”字符前面的带有&号的词。例如,文件中第六行。
5.第五个提取模式是:带有&符号的词释义内容中“UGEI”字符后面的带有&号的词。例如,文件中第七行。
6.第六个提取模式是:带有&符号的词释义内容中“BVSV”字符后面的带有&号的词。例如,文件中第八行。

虽然看起来感觉麻烦 不过我想就是几行代码的事儿,因为提取模式都差不多,所以希望大佬们帮帮小白,谢谢。期待大家的回信。祝大家有个美好的一天
最佳答案
2021-11-17 22:43:48
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.
CINGGIS&HAGAN:Yn#GAR-VN&USUG:Yn.
SINJI&CINAR:Yn#AGVLA-YIN&0R0I:Yn-YIN T0BCI NEREIDUL.
OL&H0G0LA:Yn#EMEGE&EJI:Yn-GI LABLAJV UJE.
BVSIGV&TURGEN:Yn#CAGAN&IDEGE:Yn-UN HUNDUDHEL.
LABDAGVN&T0GTAGVN:Ya#CAGAN UGEI GALTV&AGVLA:Yn.
G0Y0&SAYIHAN:Ya#JUI BVSV NEYIGEM&JIRVMTV:Ya."""
    for i in text.splitlines():
        if get(i):
            print(get(i))
    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-17 20:06:54 From FishC Mobile | 显示全部楼层
太乱,看得头疼,搞不清为啥要分那么多模式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-17 21:41:33 | 显示全部楼层
wp231957 发表于 2021-11-17 20:06
太乱,看得头疼,搞不清为啥要分那么多模式

感谢您的回复,其实能实现模式1和2就好了,别的都是换个字符就行,希望您看看,就实现1和2。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-17 21:54:37 | 显示全部楼层
23456,基本是一个意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-17 22:03:47 | 显示全部楼层
你就标一下,要哪些数据就得了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-17 22:43:48 | 显示全部楼层    本楼为最佳答案   
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.
CINGGIS&HAGAN:Yn#GAR-VN&USUG:Yn.
SINJI&CINAR:Yn#AGVLA-YIN&0R0I:Yn-YIN T0BCI NEREIDUL.
OL&H0G0LA:Yn#EMEGE&EJI:Yn-GI LABLAJV UJE.
BVSIGV&TURGEN:Yn#CAGAN&IDEGE:Yn-UN HUNDUDHEL.
LABDAGVN&T0GTAGVN:Ya#CAGAN UGEI GALTV&AGVLA:Yn.
G0Y0&SAYIHAN:Ya#JUI BVSV NEYIGEM&JIRVMTV:Ya."""
    for i in text.splitlines():
        if get(i):
            print(get(i))
    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-11-18 00:07:40 | 显示全部楼层
kaohsing 发表于 2021-11-17 22:03
你就标一下,要哪些数据就得了。

先找到#符号前面带有带有&符号的词,之后有两个需求:

1.您刚刚总结的对,23456就是一个意思,所以实现一个就行,别的我就照葫芦画瓢。例如,一行数据:A&B:Yn#C&D:Yn-YIN T0BCI NEREIDUL.先找到#前有&字符的词,也就是“A&B:Yn”,然后提取“-YIN T0BCI NEREIDUL”字符串前面带有&字符的"C&D:Yn"词;提取结果是:A&B:Yn=C&D:Yn;

2.二是直接提取#前后都带有&字符的词。例如;E&F:Yn#G&H:Yn.但是这一行数据中除了例子显示的以外,若有任何别的字符我就不提取了。意思是就要提取#前后都带有&字符的词,而且没有别的词。就像所示例子一样。

希望这次我说的稍微清楚一些,谢谢哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-18 00:11:49 | 显示全部楼层
Amgalang 发表于 2021-11-18 00:07
先找到#符号前面带有带有&符号的词,之后有两个需求:

1.您刚刚总结的对,23456就是一个意思,所以实 ...

可能我说的思维不对,就像您说的 我这次就说我需要得到什么数据:

简化的文件,如下:
A&B:Yn#C&D:Yn.
E&F:Yn#G&H:Yn--YIN T0BCI NEREIDUL.

我想代码运行过后从那么多数据中得到:1.A&B:Yn#C&D:Yn.      2.E&F:Yn#G&H:Yn.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-18 09:07:57 | 显示全部楼层

哇,完美解决了我的需求,谢谢您。希望您有空时 备注下代码,我有点读不懂一些内容,再次感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-18 11:29:04 | 显示全部楼层
[hide]

# -*- coding: UTF-8 -*-
import re
s='''

AAA#BBB.
CCC#DDDD.
CINGGIS&HAGAN:Yn#GAR-VN&USUG:Yn.
SINJI&CINAR:Yn#AGVLA-YIN&0R0I:Yn-YIN T0BCI NEREIDUL.
OL&H0G0LA:Yn#EMEGE&EJI:Yn-GI LABLAJV UJE.
BVSIGV&TURGEN:Yn#CAGAN&IDEGE:Yn-UN HUNDUDHEL.
LABDAGVN&T0GTAGVN:Ya#CAGAN UGEI GALTV&AGVLA:Yn.
G0Y0&SAYIHAN:Ya#JUI BVSV NEYIGEM&JIRVMTV:Ya.


'''

def k(s):
    r = re.compile("[BU][SVGEI]{3} (.*?)\.|(.*?&.*?):Yn-.*?\.")
    result = r.findall(s, re.M|re.I)
    l=[ ''.join(list(i))  for  i in result ]
    print(l)

k(s)

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

使用道具 举报

发表于 2021-11-18 11:30:29 | 显示全部楼层
试试
游客,如果您要查看本帖隐藏内容请回复

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

使用道具 举报

 楼主| 发表于 2021-11-18 14:16:04 | 显示全部楼层

您好,我调试代码后发现了3个小问题,希望您有空的时候帮我改进一下,别的没问题了,真心感谢。

为了看着方便,先给到我简化的原始数据(一些模式做了删减):
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.

问题一:我想提取指定一些词的符合代码的数据。意思就是我这里有一个AA.txt,这里每一行有一个词,需要代码读取AA.txt里的词,找其模式匹配的数据。A.txt内容如下:
A&A:Yn
C&C:Yn
找这些指定词的符合模式的提取数据,这个该怎么实现呢?

问题二:提取的数据中有重合关系,想分开提取。具体而言:原始文件中,”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}这样的一列排序。能实现吗?

问题三:像原始文件里第六行所示,一些词与指定数字后面的词有关系,我想提取它。例如,第六行提取结果是{G&G:Yn#①H&H:Yn},不提取②后面的词,因为其没有符号”&“。

上述三个改进是对全局的改进,1,2,3间都是相互协作的。需求我说完了,麻烦您了,希望您有空时改进一下,哈哈哈 谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-18 16:33:17 | 显示全部楼层
我还是没有看明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-19 07:55:13 | 显示全部楼层

也提取成功了,谢谢您,我现在又碰到新问题了,能帮我改进下代码吗?具体问题在12#,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 18:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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