【问题标题】:How to remove date chunk from bigger string without regex?如何在没有正则表达式的情况下从较大的字符串中删除日期块?
【发布时间】:2020-04-22 16:40:32
【问题描述】:

注意 - 这个问题可能看起来类似于 thisthisthis,但它们都没有完全解决我的问题。

我想从包含此日期字符串的较大长度的字符串中删除可能的日期字符串。就像输入字符串是"13th June 2020 is the day to remember" 一样,输出将是"is the day to remember"。现在我已经尝试了这三个模块:

  1. parseddatetime
  2. date-extractor
  3. datefinder

像这样:

import parsedatetime as pdt
from date_extractor import extract_dates as ed
from datetime import datetime as dt
from datefinder import find_dates as fd
cal = pdt.Calendar()

def check_date_parseddatetime(date_string):
    date_parsed, parse_status = cal.parse(date_string)
    #print(f"check_date_parseddatetime :: date_parsed : {date_parsed}")

def check_date_extractor(date_string, prec_=False):
    try:
        dt_parsed = ed(date_string)
        #print(f"check_date_extractor :: dt_parsed : {dt_parsed}")
    except Exception as e:
        #print(f"check_date_extractor :: error")
        pass

def check_datefinder(date_string, date_extract_result=(False, )):
    datefinder_list = [str(m) for m in fd(date_string)]
    #print(f"check_datefinder :: datefinder_list : {datefinder_list}")

这是字符串" 13 jun 19 : Once upon a time"的示例输出

parseddatetime提供:

time.struct_time(tm_year=2020, tm_mon=6, tm_mday=13, tm_hour=16, tm_min=23, tm_sec=48, tm_wday=5, tm_yday=4, tm_isdst=0)

date_extractor提供:

[datetime.datetime(2019, 6, 13, 0, 0, tzinfo=<UTC>)]

datefinder提供:

[datetime.datetime(2019, 6, 13, 0, 0)]

使用它们的问题是它们可以很好地解析字符串中的确切日期,但它们仍然没有返回找到该日期的确切单词块。

这是我正在尝试的所有测试数据。日期解析工作得很好,但它们都没有返回任何匹配的字符串来提取这个解析的日期:

l = ['13 jun 19 : Once upon a time', '13-jun-19', '13JUN19', '13 dec 19', '13-dec-19', '13th june 2019', '13th december 2019', '13-06-19', '13.06.19', '13.6.19', '13.12.19', '13/06/19', '13/12/19', '12 jan 2009', '12 jan, 2009', 'jan 12 2009', 'jan 12, 2009', '12 january 2009', '12 january, 2009', 'january 12 2009', 'january 12, 2009', '01 12 2009', '12-01-2009', '12 - 01 - 2009', '12/01/2009', '12 / 01 / 2009', '12 /01 /2009', '12/ 01/ 2009', '12/ 01 /2009', '12 /01/ 2009', '12 01 2009', '12 1 2009', '13 01 2009', '12 21 2009', '15 1 2009', '2 15 2009', '01-12-2009', '01/12/2009', '12.01.2009', '01.12.2009', '13-Jun-18', '13 Jun 19', '13 Jun, 19', '13, Jun 19', 'bla13 bla 14, Jun 19 sdfhkjn jd 12', '18-Feb-2008', '18 - Feb - 2008', '18 -Feb -2008', '18- Feb- 2008', '18 -Feb- 2008', '18- Feb -2008', '13-Jun-18 , 18-Feb-08', 'june 20', 'Jul 01, 2019', 'Jul 01 2019', 'Aug 5 2019', '21 Jun 2019, 18:00', '6/12/19', '6/18', '29 DEC 19', '29-DEC-19', '29/12/19', '14J1-N19', '12/Jul/2019 12/Aug/2019 MEISHAN BRIDGE 06:00']

在所有情况下,所需的输出都是空字符串,除了这三种情况,除了日期之外还有额外的单词:

['13 jun 19 : Once upon a time', 'bla13 bla 14, Jun 19 sdfhkjn jd 12', '21 Jun 2019, 18:00', '12/Jul/2019 12/Aug/2019 MEISHAN BRIDGE 06:00']

以上三种情况的输出应该是:

[': Once upon a time', 'bla13 bla  sdfhkjn jd 12', ', 18:00', ' MEISHAN BRIDGE 06:00']

我曾考虑为每种情况编写正则表达式,但稍后会引入更多日期测试用例(可能使用这些模块处理),因此为所有这些情况编写正则表达式以匹配更大的字符串将煞费苦心。如何在没有正则表达式的情况下实现这一点?是否有任何其他模块(或这三个模块中的任何一个)返回我们获取解析日期的完全匹配,从而可以帮助从更大的字符串中删除该部分?

【问题讨论】:

    标签: python python-3.x string date


    【解决方案1】:

    我发现了一个名为 python-sutime 的新包 [斯坦福 NLP 的 sutime java 库的 python 包装器]。它可以帮助我从字符串中删除特定的日期块。即使单个字符串中有多个日期,它也可以工作。

    使用此包的缺点是需要额外安装 java jdk 依赖项。但是,尽管如此,这对于完成任务来说还是很完美的。

    这是我使用的用法示例:

    from sutime import SUTime
    test_string = "13 jun 19 : Once upon a time"
    jar_files = os.path.join(os.path.dirname(__file__), 'jars')
    sutime = SUTime(jars=jar_files, mark_time_ranges=True)
    sutime_parsed_vals = sutime.parse(test_case)
    sutime_parsed_vals = [i for i in sutime_parsed_vals if i['type']=='DATE']
    temp_string = deepcopy(test_string)
    for parsed_val in sutime_parsed_vals:
        start, end = [parsed_val["start"], parsed_val["end"]]
        temp_string = temp_string[:start] + (end - start)*' ' + temp_string[end:]
    output = ' '.join(temp_string.split())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多