Python Regex - 涉及两个文本文件的异常

时间:2017-08-15 11:20:04

标签: python regex python-2.7

我有两个文本文件:text1和text2。

的text1:

(test1)
(test2)
(g)
(test3)
(test4)
(test5)

text2的:

(test5)
(testa)
(testb)
(testc)
(testd)
(teste)

我有以下代码:

import re

pattern = re.compile(r"(\((?!test2:|g}|test4)[\w+ :]+\))")
with open("text2.txt", "r") as f:
    words = pattern.findall(f.read())

with open("text1.txt", "r+") as f:
    content = pattern.sub(lambda x: words.pop(0) if words else x.group(), f.read())
    f.seek(0)
    f.write(content)
    f.truncate()

这段代码的作用是,通过使用正则表达式,按顺序逐个更改test1.txt中括号内的单词,并使用test2.txt中括号内的单词,并使用" test2"," test4"一封信" g"。但是,我想提出另一个例外:例如,如果(test5)出现在两个文件中,即使它们在不同的行中,它也不会被re选中,所以它赢了。被替换;像这样留下text1.txt:

(testa)
(test2)
(g)
(testb)
(test4)
(test5)

我的问题是:我该怎么做?我应该改变程序的逻辑吗?或者我应该改变RE?

1 个答案:

答案 0 :(得分:0)

不考虑您发布的模式中的一些错误(我不知道这对于您的示例如何),关于策略,您可以将所有异常添加到列表中,并且一旦迭代两个文件,附加新的异常(两个文件中都出现)并通过插入所有它们(例外)加入'|'来编译正则表达式字符。

此代码适用于我。

import re

exceptions=['test2','test4','g']
pattern1 = re.compile(r"(\((?!"+'|'.join(ex for ex in exceptions)+")[\w+ :]+\))")

with open("text2.txt", "r") as f:
    words = pattern1.findall(f.read())
    print(words)

with open("text1.txt", "r+") as f:
    text = f.read()
    for line in text.splitlines():
        if line in words:
            new_exception =  re.search(r'\(([\w+ :]+)\)',line)
            exceptions.append(new_exception.group(1))
            words.remove(line)

    all_exceptions_compiled = re.compile(r"(\((?!"+'|'.join(ex for ex in exceptions)+")[\w+ :]+\))")
    content = all_exceptions_compiled.sub(lambda x: words.pop(0) if words else x.group(), text)
    f.seek(0)
    f.write(content)
    f.truncate()

请注意,我已通过以下方式修改了您的正则表达式模式:(\((?!test2|g|test4)[\w+ :]+\))

此代码在列表上实现迭代(On)和删除(On)操作,这取决于n的大小,不能成为有效的解决方案。如果要考虑性能,则应该改进此部分。