【问题标题】:python 3 regex pattern replacementpython 3 正则表达式模式替换
【发布时间】: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)

我的问题是:

  1. 我不知道如何将^M 字符表示为模式。我用\r\n
  2. 我不知道如何在新的替换模式中引用以前的匹配项。我将\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)

标签: python regex csv newline


【解决方案1】:

要匹配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)

请注意,我转义了反斜杠 \/,因为有时需要这样做(在反斜杠用作匹配/替换字符串之间的分隔符的情况下)。修改以满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2012-02-12
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多