我有一堆段落,其中的日期格式不同。例如: 1776年5月1日,在长岛战役中参加战斗的美军士兵 在哈利法克斯(Halifax)团聚后,威廉·豪(William Howe)决定将战斗带给美国人。[139]他于1776年6月5日起航,并于1949年7月2日在纽约港入口附近的史坦顿岛上开始登陆部队。由于军事情报不力,华盛顿将其军队分散到曼哈顿岛和长岛西部的东河上。 ,[140]而美国人拒绝进行和平谈判的非正式尝试。[141]在8月27日,豪豪森超越华盛顿,将他逼回布鲁克林高地02-03-2019。 Howe限制2012年1月2日追随他的下属,而选择围困2014年2月3日,华盛顿。[142]
在示例段落中,有一些日期,例如
1776年5月1日
1776年6月5日
1949年7月2日
2012年1月2日
2014年2月3日
02-03-2019
我需要从本段中提取这些日期。我发现有一个python包在做这样的事情:datefinder 希望有人能对我有所帮助,或者请告诉我还有其他方法可以实现它。 感谢advace
答案 0 :(得分:1)
您可以这样做。
这不是最佳选择,可能会检测到非日期字符串/未检测到日期
但它可以与您给出的示例一起使用
let text = "I've a bunch of paragraph, which have dates in it in different format. for Example: American soldiers in combat at the Battle of Long Island, 1 May, 1776 After regrouping at Halifax, William Howe determined to take the fight to the Americans.[139] He set sail in 5 June 1776 and began landing troops on Staten Island near the entrance to New York Harbor on July 2 1949. Due to poor military intelligence, Washington split his army to positions on Manhattan Island and across the East River in western Long Island,[140] and an informal attempt to negotiate peace was rejected by the Americans.[141] On 06 August 27, Howe outflanked Washington and forced him back to Brooklyn Heights 02-03-2019. Howe restrained 01/02/2012 his subordinates from pursuit, opting to besiege 02/03/2014 Washington instead.[142] test 2 1254"
let dates = [];
let words = text.split(" ")
// these char if left in string cannot be send to date
// Maybe you'll need to add some as you enconter them
let forbiddenChar = /[.]/g
// for each word
for (let i in words) {
// if it contains 4 consecutive number (something looking like a year)
if (words[i].match(/.*[0-9]{4}.*/)) {
// if the "year" is not at the start (full date)
if (words[i].search(/[0-9]{4}/) !== 0) {
words[i] = words[i].replace(/[-]/g, "/").replace(forbiddenChar, " ");
let date = new Date(words[i])
if (date.toString() != "Invalid Date") {
dates.push(date)
}
// the "year" is at the start of word
} else {
if (i >= 2) {
// the other part of the date appear before the year
let date = `${words[i - 2]} ${words[i - 1]} ${words[i]}`
date = new Date(date.replace(forbiddenChar, " "))
if (date.toString() != "Invalid Date") {
dates.push(date)
}
}
}
}
}
console.log(dates)