在Python中使用sub()方法

时间:2019-01-29 12:35:38

标签: python regex

我想使用regexp和Python替换文件中的文本。使用sed,我可以在命令行上执行类似的操作

sed -r 's/([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3})/\1\2xx.xx/' ./input/my_file > ./output/my_file_new

基本上需要查找ip = [4个八位字节]的字符串,并将后两个替换为xx。

输入文件如下

name=rockband&ip=176.4.23.71&releasedate=none
name=rockband2&ip=121.1.44.52&releasedate=none

所需的输出文件如下

name=rockband&ip=176.4.xx.xx&releasedate=none
name=rockband2&ip=121.1.xx.xx&releasedate=none

我需要将其放入我正在使用的Python脚本中

import re
regexp = re.compile(r's/([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3})/\1\2xx.xx/')

def replace(source_file_path):
fh, target_file_path = mkstemp()

with codecs.open(target_file_path, 'w', 'utf-8') as target_file:
    with codecs.open(source_file_path, 'r', 'utf-8') as source_file:
        for line in source_file:
            print(line)
            target_file.write( !! How to use sub in here )
remove(source_file_path)
move(target_file_path, source_file_path)

如何使用sub()方法来实现我想做的事情?我需要将3个参数传递给该方法,并且只能考虑如何传递2个,我不知道第三个参数应该是什么

target_file.write(re.sub(regexp, line))

1 个答案:

答案 0 :(得分:1)

对您的代码的最低要求为:

import re
regexp = re.compile(r'([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3})')

def replace(source_file_path):
    fh, target_file_path = mkstemp()

    with codecs.open(target_file_path, 'w', 'utf-8') as target_file:
        with codecs.open(source_file_path, 'r', 'utf-8') as source_file:
            for line in source_file:
                print(line)
                target_file.write(regexp.sub(r'\1\2xx.xx', line))
    remove(source_file_path)
    move(target_file_path, source_file_path)

regexp仅定义要匹配的内容。 sub()争论用什么替代。

您可以调用re.sub(),它接受​​三个必需的参数:要匹配的内容,要替换的内容以及要处理的字符串。或者像上面的示例一样,当您已经有预编译的正则表达式时,可以使用其sub()方法,在这种情况下,需要说明要用什么替换以及要使用的字符串。