【发布时间】:2015-01-06 02:11:20
【问题描述】:
我有一个格式错误的 csv 文件需要修复:
- 该文件应该每行有一条记录,但由于这个格式问题,它有一个 MS-DOS 换行符 (
^M)。 - 更糟糕的是,CSV 文件的最后一个字段是一个文本字段,它还包含这个 MS-DOS 换行符,所以我不能简单地替换
^M字符。 - 但好消息是文件的第一个字段是 DATE 字段 (
MM/DD/YY)
所以我尝试用 (\rMM/DD/YY) 替换 (\r\nMM/DD/YY) 模式,但没有成功。这是我的代码 sn-p:
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模式。
【问题讨论】:
-
以前的匹配必须用括号
(...)分组,以便回溯。 -
谢谢。让我明天再试看看!
-
对于 1. 这似乎是表示 MS-DOS 换行符的正确方法。 2.您的替换不应该起作用,因为您的正则表达式格式错误(包含不平衡的括号)。你必须捕获你想找回的每一场比赛,比如:
r"""\r\n(\d{2})/(\d{2})/(\d{2})""",但这样做更容易re.sub(r"""\r\n(\d{2}/\d{2}/\d{2})""", r"""\r\1""", malformed_content)