Python字符串文字,正则表达式和sed

时间:2016-03-18 15:32:49

标签: python regex sed

我是Python的新手。

我使用python脚本将一系列文件导入sqlite3数据库。某些原始文件具有虚假的^M个字符,可将记录拆分为多行。

以下sed命令正确删除^M并加入两行,创建有效记录。

sed -i '/^M^M$/ {s/^M//g;N;s/\n//};' <file>

上面的^M是使用CTRL+V CTRL+M序列创建的。

sed调用的Python行是:

cmd = "sed -i '/\^M\^M$/ {s/\^M//g; N; s/\n////g; };' %s" % (file)
os.system(cmd)

我在Python中尝试了各种转义序列(包括三元组'')并获得解析错误,包括unterminated address regexunterminated 's' commandunknown option to 's',并且没有转义{ {1}}我得到了^M

的硬停止解析错误

我怎么能

a)对sed调用进行编码,以便在使用SyntaxError: EOL while scanning string literal

调用时正确执行

b)直接在python中执行等效替换(可能更好,但我希望能够在一次传递中执行多种类型的更正,而不是每种更正类型一次传递)。

谢谢。

2 个答案:

答案 0 :(得分:4)

^M字符为Carriage Return (CR)。它是python中的'\r'字符。

所以,我想,这应该可以正常工作:

cmd = "sed -i '/\r\r$/ {s/\r//g; N; s/\\n////g; };' %s" % (file)
os.system(cmd)

答案 1 :(得分:1)

这会更容易,特别是因为你说你有多个替换要执行,完全用Python完成。回车符是"\r"

该任务的未经测试代码如下:

replacements = (("\r", ""),
                ("one", "two"),
                ("three", "four"))
with open(filename, "r") as fin, open(filename+".new", "w") as fout:
    data = fin.read()
    for t1, t2 in replacements:
        data = data.replace(t1, t2)
    fout.write(data)

然后,它仍然是读者重命名输出文件以覆盖输入文件的练习。顺便说一下,请注意,此代码是明确设计用于处理文本文件的。在Python 3中会产生影响。