Amgalang 发表于 2021-11-17 08:32:21

提取指定字符串中间的字符求助,谢谢

早上好,我有一个文本文档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”字符后面的带有&号的词。例如,文件中第八行。

虽然看起来感觉麻烦 不过我想就是几行代码的事儿,因为提取模式都差不多,所以希望大佬们帮帮小白,谢谢。期待大家的回信。祝大家有个美好的一天{:10_287:}

wp231957 发表于 2021-11-17 20:06:54

太乱,看得头疼,搞不清为啥要分那么多模式

Amgalang 发表于 2021-11-17 21:41:33

wp231957 发表于 2021-11-17 20:06
太乱,看得头疼,搞不清为啥要分那么多模式

感谢您的回复,其实能实现模式1和2就好了,别的都是换个字符就行,希望您看看,就实现1和2。谢谢

kaohsing 发表于 2021-11-17 21:54:37

23456,基本是一个意思。

kaohsing 发表于 2021-11-17 22:03:47

你就标一下,要哪些数据就得了。

qq1151985918 发表于 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.strip()}
    elif "BVSV" in v:
      res = {k.strip():v.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))
   

Amgalang 发表于 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.但是这一行数据中除了例子显示的以外,若有任何别的字符我就不提取了。意思是就要提取#前后都带有&字符的词,而且没有别的词。就像所示例子一样。

希望这次我说的稍微清楚一些,谢谢哒

Amgalang 发表于 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.

Amgalang 发表于 2021-11-18 09:07:57

qq1151985918 发表于 2021-11-17 22:43


哇,完美解决了我的需求,谢谢您。希望您有空时 备注下代码,我有点读不懂一些内容,再次感谢。{:10_275:}

kaohsing 发表于 2021-11-18 11:29:04

**** Hidden Message *****


kaohsing 发表于 2021-11-18 11:30:29

试试
**** Hidden Message *****

Amgalang 发表于 2021-11-18 14:16:04

qq1151985918 发表于 2021-11-17 22:43


您好,我调试代码后发现了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间都是相互协作的。需求我说完了,麻烦您了,希望您有空时改进一下,哈哈哈 谢谢。

kaohsing 发表于 2021-11-18 16:33:17

我还是没有看明白

Amgalang 发表于 2021-11-19 07:55:13

kaohsing 发表于 2021-11-18 11:29


也提取成功了,谢谢您,我现在又碰到新问题了,能帮我改进下代码吗?具体问题在12#,谢谢。
页: [1]
查看完整版本: 提取指定字符串中间的字符求助,谢谢