【问题标题】:To find some words in a text file using regex and later print them in a different text file使用正则表达式在文本文件中查找一些单词,然后在不同的文本文件中打印它们
【发布时间】:2022-07-07 15:22:10
【问题描述】:

我需要使用正则表达式在文本文件 (origin.txt) 中找到一些单词,例如继承、继承、Ingeritable 等,然后我想在新的文本文件 (origin_spp.txt) 中打印它们和找到它们的行。

这是我的代码

re_pattern_string = r'(?:inherit|INHERIT|Inherit)*\w'

print('Opening origin.txt')
with open('origin.txt', 'r') as in_stream:
    print('Opening origin_spp.txt')
    with open('origin_spp.txt', 'w') as out_stream:
        for num, line in enumerate (in_stream):
        re_pattern_object = re.compile(re_pattern_string)
        line = line.strip()
        inherit_list = line.split()
        temp_list = re_pattern_object.findall('line')
        complete = origin_list.append('temp_list')
        for word in temp_list:
            out_stream.write(str(num) + '\t{0}\n'.format(word))

print("Done!")
print('origin.txt is closed?', in_stream.closed)
print('origin_spp.txt is closed?', out_stream.closed)

if __name__ == '__main__':
    print(temp_list)

你能帮帮我吗?我没有得到任何东西,我不知道错误在哪里。

提前谢谢你

我需要将我想在 origin.txt 中找到的单词打印在不同的文本文件中。

这个新文件必须包含origin.txt中的行号加上单词/s。

【问题讨论】:

    标签: regex string printing line findall


    【解决方案1】:

    您的代码有一些问题:

    • 在 for 内部定义 re.compile 是多余的。
    • 对于 re_pattern_object.findall('line') 和 origin_list.append('temp_list') 不要用'' 包装变量
    • findall 我们不需要迭代行,它适用于整个文本。

    因为你没有提供输入和输出我只是猜测你想要什么:

    import re
    
    re_pattern_string = r'((?:inherit|INHERIT|Inherit)(\w*))'
    originmain_list = []
    re_pattern_object = re.compile(re_pattern_string)
    print('Opening origin.txt')
    with open('origin.txt', 'r') as in_stream:
        print('Opening origin_spp.txt')
        with open('origin_spp.txt', 'w') as out_stream:
            for num, line in enumerate(in_stream):
                temp_list = re_pattern_object.findall(line)
                for word in temp_list:
                    out_stream.write(str(num) + '\t{0}\n'.format(word[0]))
                    originmain_list.append((num, word[0]))
    
    print("Done!")
    print('origin.txt is closed?', in_stream.closed)
    print('origin_spp.txt is closed?', out_stream.closed)
    print(originmain_list)
    
    

    如果origin.txt 包含:

    inheritxxxxxxx some text INHERITccccc some text
    Inheritzzzzzzzz some text
    inherit some text INHERIT some text
    Inherit some text
    

    origin_spp.txt 中的输出将是

    0   inheritxxxxxxx
    0   INHERITccccc
    1   Inheritzzzzzzzz
    2   inherit
    2   INHERIT
    3   Inherit
    

    命令行输出将是:

    Opening origin.txt
    Opening origin_spp.txt
    Done!
    origin.txt is closed? True
    origin_spp.txt is closed? True
    [(0, 'inheritxxxxxxx'), (0, 'INHERITccccc'), (1, 'Inheritzzzzzzzz'), (2, 'inherit'), (2, 'INHERIT'), (3, 'Inherit')]
    

    【讨论】:

    • 感谢您的回答。对输出感到抱歉,但我需要的是类似 352 继承 662 继承 785 继承 880 继承。但是,我从您的建议中得到的是:raceback(最近一次调用最后一次):文件“origin_spp_2.py”,第 35 行,在 re_pattern_object = re.compile(re_pattern_string) 文件“/usr/lib/python3.8 /sre_parse.py", line 668, in _parse raise source.error("nothing to repeat", re.error: nothing to repeat at position 29 我不知道为什么。非常感谢您的帮助
    • 你要统计这个词出现的次数吗?
    • 请提供您想要的输入和输出问题
    • 不,我希望新的文本文件 (origin_spp.txt) 显示我要查找的单词出现在 origin.txt 中的行号。输入:(行数+所需单词)。输出:352 继承 662 继承 785 继承 880 继承
    • @efp0018 我更新了解决方案,检查一下
    猜你喜欢
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多