鱼C论坛

 找回密码
 立即注册
查看: 315|回复: 18

[已解决]字符串查找和匹配问题,拜托大家

[复制链接]
发表于 2024-7-29 02:18:36 | 显示全部楼层 |阅读模式
10鱼币
大家好,拜托大家帮我看看以下问题:(真心感谢,我有初步的代码)

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

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

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 333.txt (2.26 KB, 下载次数: 2) 】的代码,这个代码能处理上述问题,但是会生成重复数据。您可以跑这个代码看看,我跑完的结果是【括号处理后的-new 205文件 括号处理后的-new 205.txt (12.31 KB, 下载次数: 1) 】,重复数据在生成的第二行。它把全部数据的处理结果都包含在了第二行,然后再开始第三行的处理。就这样时不时做一次“大总结”。我也找不到原因了,希望您练个手帮我搞一下,把这个问题解决,我搞了一天实在不行了,真心感谢。
最佳答案
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([l.strip() for l in data])

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

        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',[['<<','>>'], ['{','}'], ['<','>'],  ['(',')']])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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([l.strip() for l in data])

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

        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',[['<<','>>'], ['{','}'], ['<','>'],  ['(',')']])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-29 02:19:48 | 显示全部楼层
哈哈,字符串查找和匹配的问题就像是在海洋里捞鱼,有时候一不小心就捞上来一条大鲸鱼!但是别担心,我们一起把这个问题从海里拉出来,看看它究竟是什么样的鱼。

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

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-29 02:43:01 | 显示全部楼层
有偿解决问题,QQ1556434735
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-29 02:43:06 | 显示全部楼层
Amgalang 发表于 2024-07-29 02:43
有偿解决问题,QQ1556434735


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-29 08:49:20 From FishC Mobile | 显示全部楼层
没太明白你想干啥,半封闭的尖括号如何处理,所谓的行是以\n结束吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

现在的数据时一行一行的,但是某些行有半封闭的括号,所以想一行一行的读取找到这种半封闭的括号,然后往后找,找到其对应的封闭的括号,将这个包含对应封闭的括号的数据,往前与未封闭的括号的数据拼接,每个行都是以\n结尾呢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

可不可以 这样理解   如果 左括号 和右括号 中间 如果有\N  则删除此\N
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

希望得到你的帮助,请您查看一下我的上传的数据和代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-29 09:06:08 | 显示全部楼层
Amgalang 发表于 2024-7-29 09:03
对,将该\n替换为一个空格符,就会往前拼接了。例如:

第一行:A B > G .

直接删除 \n 不行,后面的数据会与前面的直接连起来,所以需要有一个空格符,再连接。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-29 09:10:56 | 显示全部楼层
wp231957 发表于 2024-7-29 08:59
可不可以 这样理解   如果 左括号 和右括号 中间 如果有\N  则删除此\N

例如,我数据中的4,5,6行应该变成一行数据才对,因为第四行有一个打开的<<,第六行有关闭的>>符号。或者麻烦您加我微信:1556434735或者Sun_Amgalang
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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 .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 = [i.replace('\n',' ') for i in res]

    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')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-29 11:14:16 | 显示全部楼层

收到,感谢您的解答
再想问一下,如果我想再加入几个括号的处理,例如花括号{},那么在(r'<<(.*?)>>', data, re.DOTALL)中修改?正确修改方法是什么呢?
(r'<<({.*?})>>', data, re.DOTALL)对吗?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

收到,感谢您的解答
再想问一下,如果我想再加入几个括号的处理,例如花括号{},那么在
x=re.sub(r'<<[^<>]*>>', lambda m: m.group(0).replace('\n', '  '), txt)中怎么写入呢?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-29 11:46:25 | 显示全部楼层

请您帮再加一个,对已经处理后的文本,删除每个行【首尾】的多余空格符的操作吗,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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([l.strip() for l in data])

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

        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',[['<<','>>'], ['{','}'], ['<','>'],  ['(',')']])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

处理好了,真心感谢您的帮助哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 23:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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