删除文件中的多行

时间:2017-12-21 00:09:21

标签: python

我有多个HTML文件,我必须删除里面的一些行。

除了脚本标记之外,我需要删除的行在开头和结尾没有关键字,但我不想删除这些文件中的所有脚本标记。

我需要删除的HTML部分示例:

<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXXXXX-X']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>

你认为这样做有可能,如果可以的话?

更新

我对下面的@ARJMP解决方案进行了一些修改,但它在不删除正则表达式中的分析标记的情况下再次返回相同的文件。

@ARJMP https://regex101.com/r/rWLZRD/1

正确的正则表达式

为什么正则表达式没有减去?

import re
from collections import defaultdict

ga_re = r"<script type=\"text\/javascript\">\s+var _gaq = _gaq .*</script>"  # our regex to subtract google analytics script
file_texts = defaultdict(str)  # Temp store for file text
file_paths = ['index.html']  # list of files you want to run

for file_path in file_paths:
    with open(file_path, mode='r+') as fin:
        # Extract text from file
        file_text = ''.join(fin.readlines())
        file_texts[file_path] = file_text

        # Write to backup file
        with open('{}.backup'.format(file_path), mode='w+') as fbackup:
            fbackup.write(file_text)
    with open(file_path, mode='w+') as fout:
        # Perform regex sub and write to file
        file_text = file_texts[file_path]
        file_text_result = re.sub(ga_re, '', file_text, re.DOTALL) 
        fout.write(file_text_result)

1 个答案:

答案 0 :(得分:1)

这是一个正则表达式解决方案,虽然正则表达式不是最好的方法,考虑到你的非常简单的用例,这可以用来解决你的问题。

检查脚本标记后跟async function runSequence (initialValue) { let input = initialValue for (var i = 0; i < sequence.length; i++) { input = await sequence[i](input) } return input } runSequence(0) .then(finalValue => console.log(finalValue)); // 2 ,并以var _gaq = _gaq

的第一次出现结束的正则表达式

https://regex101.com/r/rWLZRD/1

</script>

好的,所以你还需要为多个文件执行此操作,您可以使用遍历文件列表并应用正则表达式的脚本来执行此操作。此脚本还将生成{file} .backup,因为它会修改原始文件。

import re

regex = r"<script type=\"text\/javascript\">\s+var _gaq = _gaq .*</script>"

test_str = ("<script type=\"text/javascript\">\n"
    "var _gaq = _gaq || [];\n"
    "_gaq.push(['_setAccount', 'UA-XXXXXXXX-X']);\n"
    "_gaq.push(['_trackPageview']);\n"
    "(function() {\n"
    "var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n"
    "ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n"
    "var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n"
    "})();\n"
    "</script>")

matches = re.sub(regex, test_str, re.DOTALL)

你也可以使用像argparse这样的东西制作一个命令行脚本,它可以接受命令行上的文件名列表,提供创建或不创建备份的选项等等,但这超出了这个答案的范围。