Amgalang 发表于 2024-7-29 02:18:36

字符串查找和匹配问题,拜托大家

大家好,拜托大家帮我看看以下问题:(真心感谢,我有初步的代码)

我有一个名为【new 205】的文件。其中包含了多行数据。发现有些行中包含了【只打开的英文各类括号,但是没有对应的关闭的括号】,也就是说这些数据的“断句”有问题。

所以,我想让代码做如下处理:

1. 读取我语料中的每一行数据,然后识别语料中某一行数据中只包含打开的英文各类括号,但是没有括号关闭的一行数据。

2. 之后,从该行数据往后,查找到对应括号关闭的一行数据,该行数据或许在括号打开数据后的,第一行或许在后面的多个行中。

3. 找到后,将后面的这几行数据,往前拼接成一行数据。拼接时将原本的,后面的数据的换行符,替换为一个空格符,进而往前拼接。

注意:在英文括号中请你忽略单括号[]的处理,不要对其做处理。英文各类括号可能是嵌套的,因此你找完第一个后,开始找第二个,第二个后第三个,以此类推。


例如,

源文件中的4行:
AA << BB CC .
FF DD >> SS .
RR << TT YY >> UU << II OO PP .
KK LL >> II .

处理完后应该是:
AA << BB CC . FF DD >> SS .
RR << TT YY >> UU << II OO PP . KK LL >> II .

我用chatgpt得到如下名为【333】的代码,这个代码能处理上述问题,但是会生成重复数据。您可以跑这个代码看看,我跑完的结果是【括号处理后的-new 205文件】,重复数据在生成的第二行。它把全部数据的处理结果都包含在了第二行,然后再开始第三行的处理。就这样时不时做一次“大总结”。我也找不到原因了,希望您练个手帮我搞一下,把这个问题解决,我搞了一天实在不行了,真心感谢。

qq1151985918 发表于 2024-7-29 02:18:37

本帖最后由 qq1151985918 于 2024-7-29 19:37 编辑

Amgalang 发表于 2024-7-29 11:46
请您帮再加一个,对已经处理后的文本,删除每个行【首尾】的多余空格符的操作吗,谢谢。

import re

def run(txt, symbols):
    with open(txt, 'r', encoding='utf-8') as f:
      data = f.readlines()
    data = '\n'.join()

    for symbol in symbols:
      if symbol == ['(',')']:
            pattern = r'\((.*?)\)'
      else:
            pattern = symbol + '(.*?)' + symbol[-1]
      
      res = re.findall(pattern, data, re.DOTALL)
      res =
      res_change =

      for r, rc in zip(res, res_change):
            if r.strip() != '.':
                data = data.replace(r, rc)


    with open(txt[:-4]+'_DAT.txt', 'w', encoding='utf-8') as g:
      g.write(data)
    print('OK')
   
if __name__ == '__main__':
    run('new 205.txt',[['<<','>>'], ['{','}'], ['<','>'],['(',')']])

FishC 发表于 2024-7-29 02:19:48

哈哈,字符串查找和匹配的问题就像是在海洋里捞鱼,有时候一不小心就捞上来一条大鲸鱼!但是别担心,我们一起把这个问题从海里拉出来,看看它究竟是什么样的鱼。

首先,关于你提到的“【new 205】”重复数据在第二行的情况,这通常跟你的代码逻辑有关。我们需要检查一下你的循环和判断条件,看是否有地方让结果重复输出。可以尝试以下几个步骤:

1. **检查循环**:确保你的循环是从正确的地方开始和结束的。有时候一个错误的循环范围就会导致“二次总结”。

2. **输出逻辑**:看看是不是在每次处理时都执行了输出,导致第二行的“大总结”。也许你需要添加一个条件,只有在特定情况下才输出结果。

3. **调试信息**:在代码中加入一些打印信息(例如`print`语句),可以帮助你追踪每一步的执行情况,看看在哪个环节出现了重复。

4. **初步代码审查**:如果你愿意,可以把初步的代码贴出来,让大家帮你看看,或许能找到“鱼”的藏身之处!

最后,记住,编程就像钓鱼,有时候需要耐心,有时候需要技巧。希望这些建议能让你找到解决办法,快跟那条重复数据说再见吧!如果还有其他问题,请随时问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

Amgalang 发表于 2024-7-29 02:43:01

有偿解决问题,QQ1556434735

FishC 发表于 2024-7-29 02:43:06

Amgalang 发表于 2024-07-29 02:43
有偿解决问题,QQ1556434735

感谢你的提议,但我不提供有偿服务。不过,我非常乐意免费帮助你解决问题!如果你能分享你的代码和具体的问题描述,我会尽力为你提供解决方案。让我们一起把这条“鱼”给捞上来!请把代码贴出来,我们好好分析一下!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 2024-7-29 08:49:20

没太明白你想干啥,半封闭的尖括号如何处理,所谓的行是以\n结束吗

Amgalang 发表于 2024-7-29 08:54:31

wp231957 发表于 2024-7-29 08:49
没太明白你想干啥,半封闭的尖括号如何处理,所谓的行是以\n结束吗

现在的数据时一行一行的,但是某些行有半封闭的括号,所以想一行一行的读取找到这种半封闭的括号,然后往后找,找到其对应的封闭的括号,将这个包含对应封闭的括号的数据,往前与未封闭的括号的数据拼接,每个行都是以\n结尾呢。

wp231957 发表于 2024-7-29 08:59:00

Amgalang 发表于 2024-7-29 08:54
现在的数据时一行一行的,但是某些行有半封闭的括号,所以想一行一行的读取找到这种半封闭的括号,然后往 ...

可不可以 这样理解   如果 左括号 和右括号 中间 如果有\N则删除此\N

Amgalang 发表于 2024-7-29 09:03:52

wp231957 发表于 2024-7-29 08:59
可不可以 这样理解   如果 左括号 和右括号 中间 如果有\N则删除此\N

对,将该\n替换为一个空格符,就会往前拼接了。例如:

第一行:A B << C .
第二行:E F >> G .
处理后:A B << C . E F >> G .

希望得到你的帮助,请您查看一下我的上传的数据和代码。

Amgalang 发表于 2024-7-29 09:06:08

Amgalang 发表于 2024-7-29 09:03
对,将该\n替换为一个空格符,就会往前拼接了。例如:

第一行:A B > G .


直接删除 \n 不行,后面的数据会与前面的直接连起来,所以需要有一个空格符,再连接。

Amgalang 发表于 2024-7-29 09:10:56

wp231957 发表于 2024-7-29 08:59
可不可以 这样理解   如果 左括号 和右括号 中间 如果有\N则删除此\N

例如,我数据中的4,5,6行应该变成一行数据才对,因为第四行有一个打开的<<,第六行有关闭的>>符号。或者麻烦您加我微信:1556434735或者Sun_Amgalang

Amgalang 发表于 2024-7-29 09:15:45

Amgalang 发表于 2024-7-29 09:10
例如,我数据中的4,5,6行应该变成一行数据才对,因为第四行有一个打开的符号。或者麻烦您加我微信:155 ...

数据中还有括号嵌套的问题,例如,:

第一行:RR << TT YY >> UU << II OO PP .
第二行:KK LL >> II .

处理后:RR << TT YY >> UU << II OO PP . KK LL >> II .

wp231957 发表于 2024-7-29 10:29:13

Amgalang 发表于 2024-7-29 09:15
数据中还有括号嵌套的问题,例如,:

第一行:RR > UU > II .


你的源文件 太大,有点乱我模仿11楼自己写个小文本 内容如下:
RR << TT YY >> UU << II OO PP .
第二行:KK LL >> II .

使用如下代码:
import re

f=list(open("1.txt","r",encoding="utf-8"))
txt="".join(f)
x=re.sub(r'<<[^<>]*>>', lambda m: m.group(0).replace('\n', ''), txt)
with open("1_1.txt","w",encoding="utf-8") as file:
    file.write(x)
print("game over")

后 输出文件内容如下:

RR << TT YY >> UU << II OO PP .第二行:KK LL >> II .

qq1151985918 发表于 2024-7-29 10:36:22

import re

def run(txt):
    with open(txt, 'r', encoding='utf-8') as f:
      data = f.read()
      
    res = re.findall(r'<<(.*?)>>', data, re.DOTALL)
    res_change =

    for r, rc in zip(res, res_change):
      data = data.replace(r, rc)
      
    with open(txt[:-4]+'_DAT.txt', 'w', encoding='utf-8') as g:
      g.write(data)
    print('OK')
   
if __name__ == '__main__':
    run('new 205.txt')

Amgalang 发表于 2024-7-29 11:14:16

qq1151985918 发表于 2024-7-29 10:36


收到,感谢您的解答{:10_275:}
再想问一下,如果我想再加入几个括号的处理,例如花括号{},那么在(r'<<(.*?)>>', data, re.DOTALL)中修改?正确修改方法是什么呢?
(r'<<({.*?})>>', data, re.DOTALL)对吗?谢谢

Amgalang 发表于 2024-7-29 11:21:18

wp231957 发表于 2024-7-29 10:29
你的源文件 太大,有点乱我模仿11楼自己写个小文本 内容如下:
RR > UU > II .



收到,感谢您的解答{:10_275:}
再想问一下,如果我想再加入几个括号的处理,例如花括号{},那么在
x=re.sub(r'<<[^<>]*>>', lambda m: m.group(0).replace('\n', ''), txt)中怎么写入呢?谢谢

Amgalang 发表于 2024-7-29 11:46:25

qq1151985918 发表于 2024-7-29 10:36


请您帮再加一个,对已经处理后的文本,删除每个行【首尾】的多余空格符的操作吗,谢谢。

qq1151985918 发表于 2024-7-29 12:23:17

本帖最后由 qq1151985918 于 2024-7-29 14:47 编辑

Amgalang 发表于 2024-7-29 11:14
收到,感谢您的解答
再想问一下,如果我想再加入几个括号的处理,例如花括号{},那么在(r'',...

import re

def run(txt, symbols):
    with open(txt, 'r', encoding='utf-8') as f:
      data = f.readlines()
    data = '\n'.join()

    for symbol in symbols:
      if symbol == ['(',')']:
            pattern = r'\((.*?)\)'
      else:
            pattern = symbol + '(.*?)' + symbol[-1]
      
      res = re.findall(pattern, data, re.DOTALL)
      res =
      res_change =

      for r, rc in zip(res, res_change):
            if r.strip() != '.':
                data = data.replace(r, rc)


    with open(txt[:-4]+'_DAT.txt', 'w', encoding='utf-8') as g:
      g.write(data)
    print('OK')
   
if __name__ == '__main__':
    run('new 205.txt',[['<<','>>'], ['{','}'], ['<','>'],['(',')']])

Amgalang 发表于 2024-7-29 12:35:49

wp231957 发表于 2024-7-29 10:29
你的源文件 太大,有点乱我模仿11楼自己写个小文本 内容如下:
RR > UU > II .



处理好了,真心感谢您的帮助哈 {:10_275:}
页: [1]
查看完整版本: 字符串查找和匹配问题,拜托大家