【问题标题】:Matching diverse dates in Openrefine在 Openrefine 中匹配不同的日期
【发布时间】:2017-05-14 11:49:07
【问题描述】:

我正在尝试使用 OpenRefine 2.6 中的 value.match 命令将列中的信息拆分为(至少)2 列。 但是,数据非常混乱。
我有时有完整的约会:

May 30, 1949

有时完整的日期会与其他日期和属性相结合:

May 30, 1949, published 1979
May 30, 1949 and 1951, published 1979
May 30, 1949, printed 1980
May 30, 1949, print executed 1988
May 30, 1949, prints executed 1988
published 1940

有时你有时间跨度:

1905-051905-1906

有时只有一年

1905

有时带有属性的年份

August or September 1908

似乎没有遵循任何特定的架构或顺序。
我想提取(至少)ca 开始和结束日期年份,以便有两列:

-----------------------  
|start_date | end_date|  
|1905       | 1906    |   
-----------------------  

没有其余的属性。

我可以使用
value.match(/.*(\d{4}).*?/)[0]
找到最后日期 第一个是
value.match(/.*^(\d{4}).*?/)[0]
但我在这两个公式上遇到了一些麻烦。
后者在以下情况下无法匹配任何内容:
May 30, 1949 and 1951, published 1979
而在以下情况下:
Paris, winter 1911-12 后一个公式不能匹配任何东西,前一个公式匹配 1911

有人知道我该如何解决这个问题吗?
我需要一个解决方案,将第一个日期作为 start_date,将最终日期作为 end_date,或者更好(不知道是否可能)将最早日期作为 start_date,将最晚日期作为 end_date。 此外,我很乐意了解如何提取其他信息,例如 如果 publishedprintedexecuted 出现在文本中 -> 将日期复制到新的列名称“执行”。 应该类似于创建一个新列 if(value.match("string1|string2|string3" + (\d{4}), "perform the operation", do nothing)

【问题讨论】:

  • 在你的例子中(你说有时完整的日期与其他日期和属性相结合),你能告诉每一行什么应该是 start_date 和 end_date ?不清楚。
  • 完全正确。我会选择第一个日期作为 start_date,最后一个日期作为 end_date,或者更好(不知道是否可能)最早日期作为 start_date,最晚日期作为 end_date。

标签: regex date openrefine


【解决方案1】:

value.match() 是一个非常有用但有时很棘手的函数。要从文本中提取模式,我更喜欢使用 Python/Jython 的正则表达式:

import re

pattern = re.compile(r"\d{4}")

return pattern.findall(value)

从那里,您可以创建一个连接所有年份的字符串:

return ",".join(pattern.findall(value))

或者只选择第一个:

return pattern.findall(value)[0]

或者最后一个:

return pattern.findall(value)[-1]

等等

你的子问题也一样:

import re

pattern = re.compile(r"(published|printed|executed)\s+(\d+)")

return pattern.findall(value)[0][1]

或者:

import re

pattern = re.compile(r"(published|printed|executed)\s+(\d+)")

m = re.search(pattern, value)

return m.group(2)

例子:

【讨论】:

  • 这很好用 :) 我会等着看是否还有其他正则表达式的可能性,只是为了让我清醒,但非常感谢!
【解决方案2】:

这是一个正则表达式,它将在命名组中提取 start_dateend_date

如果只有一个日期,则认为它是开始日期

((?<start_date>\d{4}).*?)?(?<end_date>\d{4}|(?<=-)\d{2})?$

Demo

【讨论】:

  • 已更新以匹配 end_date 与前面带连字符的 2 位数字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2016-01-07
相关资源
最近更新 更多