从原始字符串中提取月份名称?
Extract month name from raw string?
从原始字符串中提取月份名称
'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'
那样的多个月份)
您可以从内置的 calendar
模块导入月份名称,并使用 生成器 而不是列表推导来提高效率:
>>> 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'
使用单词拆分或单词标记化并查看单词是否在月份列表中
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']
您可以将月份存储在 set
而不是元组中,并检查单词是否在此集合中。这会将时间复杂度从 O(N*M) 降低到仅 O(N),其中 N 是字符串的长度,M 是 months_master
元组的长度。
类似的东西:
months_master = set("january", "february", ...)
month = [word for word in s.casefold().split() if word in months_master]
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()]
从原始字符串中提取月份名称
'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'
那样的多个月份)
您可以从内置的 calendar
模块导入月份名称,并使用 生成器 而不是列表推导来提高效率:
>>> 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'
使用单词拆分或单词标记化并查看单词是否在月份列表中
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']
您可以将月份存储在 set
而不是元组中,并检查单词是否在此集合中。这会将时间复杂度从 O(N*M) 降低到仅 O(N),其中 N 是字符串的长度,M 是 months_master
元组的长度。
类似的东西:
months_master = set("january", "february", ...)
month = [word for word in s.casefold().split() if word in months_master]
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()]