代码之家  ›  专栏  ›  技术社区  ›  MarkS

Regex捕获日期,然后文本

  •  1
  • MarkS  · 技术社区  · 7 年前

    我正在写一个脚本,它将一行一行地通过一个小文本文件。它应该创建一个以日期作为第一个条目的元组列表。 以及所有文本和空白,直到下一个日期作为第二个元组条目。然后重复,直到文件用完。

    如果这是文本文件的内容:

    2018-01-01
    
    Stuff.
    
    More Stuff.
    
    2018-01-02
    
    Different stuff.
    

    那么输出应该是:

    [("2018-01-01", "Stuff.\n\nMore stuff."), ("2018-01-02", "Different Stuff.")]
    

    我用的是pythex。我的正则表达式是: (\d{4}-\d{2}-\d{2})(.|\n|\r)*?

    它匹配所有日期,但从不匹配空行或文本。

    我有 MULTILINE Pythex中设置的标志。

    我也试过设置 DOTALL 但除了日期外,它还是什么都没有。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ahmed Abdelhameed    7 年前

    使能 DOTALL , 使残废 MULTILINE ,并使用以下regex:

    (\d{4}-\d{2}-\d{2})(.*?)(?=\d{4}-\d{2}-\d{2}|$)
    

    Demo .

    细节:

    • (\d{4}-\d{2}-\d{2}) 包含日期值的组1。

    • (.*?) 第2组:匹配任何内容 包括新行 .

    • (?=\d{4}-\d{2}-\d{2}|$) 积极的前瞻性以确保前一组后面跟着 任何一个 另一个日期值 字符串的结尾。


    请注意,这不仅匹配日期值,还可以匹配不符合日期条件的值(例如, 2018-99-99 ,所以您可能需要考虑到这一点。你可以检查 this question 有关如何验证日期的想法。