从原始字符串中提取月份名称?

Posted

技术标签:

【中文标题】从原始字符串中提取月份名称?【英文标题】:Extract month name from raw string? 【发布时间】:2017-05-26 09:07:19 【问题描述】:

从原始字符串中提取月份名称

'January 2045 Robots'
'2065 March Mars Colony'
'2089 December Alien'

我想从原始字符串中提取月份名称,我通过创建主元组来提取它

s = 'January 2045 Robots'
months_master = ('january','feb','march','april','may','june','july','august','september','october','november','december')
month = [i for i in months_master if i in s.casefold()]
print(month[0])
'january'

是否有任何优雅或任何 Pythonic 方式来实现这一目标

注意:目前要求输入字符串仅包含单个月份(而不是多个像 s = 'May to December Bio'

【问题讨论】:

稍微说明一下,您可能会使用 .lower() 以便这种情况不会打扰您。例如:month = [i for i in months_master if i in s.casefold().lower()] 'May to December' 呢? @PeterWood 目前不需要 你的方法不错,为什么不想用呢? 【参考方案1】:

您可以从内置的 calendar 模块导入月份名称,也可以使用 generator 而不是列表推导以提高效率:

>>> from calendar import month_name
>>> s = 'January 2045 Robots'
>>> months = m.lower() for m in month_name[1:]  # create a set of month names
>>> next((word for word in s.split() if word.lower() in months), None)
'January'

或者,您可以使用regular expression:

>>> from calendar import month_name
>>> import re
>>> pattern = '|'.join(month_name[1:])
>>> re.search(pattern, s, re.IGNORECASE).group(0)
'January'

【讨论】:

【参考方案2】:

使用分词或分词,查看该词是否在月份列表中

text = 'January 2045 Robots'
month_master = ('january','feb','march','april','may','june','july','august','september','october','november','december')
month_found = [word for word in text.split() if word.lower() in month_master]

# output ['January']

【讨论】:

【参考方案3】:

您可以将您的月份存储在 set 而不是元组中,并检查此集合中是否有单词。这会将时间复杂度从 O(N*M)(其中 N 是字符串的长度,M 是 months_master 元组的长度)降低到 O(N)。 类似的东西:

    months_master = set("january", "february", ...)
    month = [word for word in s.casefold().split() if word in months_master]

【讨论】:

split 有多贵?这也将匹配多个月,或者在找到一个之后继续检查。 也是O(N),但是只执行一次,所以总体复杂度是O(N) + O(N) * O(1);因此,@ 987654326@。并且潜在的额外结果不会打扰 OP。【参考方案4】:

calendar 模块为本地化月份名称提供了一个生成器,称为month_name。但是,此列表确实包含一个空字符串,因此您需要捕获它,并且月份出现在标题大小写中(“January”等),因此您也需要捕获它。我们通过使用if x and x in s.title() 来做到这一点——当x 是空字符串时,它的计算结果为False

from calendar import month_name
s = 'January 2045 Robots'
month = [x for x in month_name if x and x in s.title()]

【讨论】:

以上是关于从原始字符串中提取月份名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何从python中的字符串中提取月份和年份?

正则表达式匹配月份名称日,年[重复]

如何从 DataFrame 的日期列中提取月份名称和年份

从 pandas Dataframe 中提取月份数据

从日期时间对象中提取日期和月份

如何从R中具有月份名称的时间戳中提取日期