我有一个格式错误的 csv 文件,我需要修复它:
- 该文件应该每行一条记录,但由于格式问题,它有一个 MS-DOS 换行符 (
^M)。 - 更糟糕的是,CSV 文件的最后一个字段是一个文本字段,它还包含这个 MS-DOS 换行符,所以我不能简单地替换
^M字符。 - 但好消息是文件的第一个字段是 DATE 字段 (
MM/DD/YY)
所以我尝试用 (\rMM/DD/YY) 替换 (\r\nMM/DD/YY) 模式,但它没有用。这是我的代码片段:
fixed_content = re.sub(r"""\r\n\d{2})/\d{2}/\d{2}""", r"""\r\1/\2/\3""", malformed_content)
我的问题是:
- 我不知道如何将
^M字符表示为模式。我用了\r\n - 我不知道如何在新的替换模式中引用以前的匹配项。我使用
\1作为第一个MM模式,\2作为下一个DD模式,\3最后一个YY模式。
请您参考如下方法:
要匹配 DD/MM/YY 形式的日期字符串,您可以使用以下正则表达式:
\d{2}\/\d{2}\/\d{2}
如果你想backreference匹配的字符串,你必须把它放在方括号 (...) 之间,像这样:
(\d{2}\/\d{2}\/\d{2})
整个替换命令将变为:
fixed_content = re.sub(r"""\r\n(\d{2}\/\d{2}\/\d{2})""", r"""\r\1""", malformed_content)
请注意,我对反斜杠 \/ 进行了转义,因为有时需要这样做(在反斜杠用作匹配/替换字符串之间的分隔符的情况下)。修改以满足您的需求。
