Python 从(更复杂的)字符串(可能是正则表达式匹配)中提取日期字符串

Python 从(更复杂的)字符串(可能是正则表达式匹配)中提取日期字符串,python,regex,string,Python,Regex,String,我有一个字符串模板,看起来像'my_index-{year}' 我做了一些类似于string\u template.format(year=year)的事情,其中year是一些字符串。结果是一些字符串看起来像my_index-2011 现在。回答我的问题。我有一个类似于my_index-2011的字符串和我的模板'my_index-{year}'提取{year}部分的巧妙方法是什么 [注意:我知道存在]使用split()string函数将字符串拆分为破折号周围的两部分,然后只抓取第二部分 mys

我有一个字符串模板,看起来像
'my_index-{year}'

我做了一些类似于
string\u template.format(year=year)
的事情,其中year是一些字符串。结果是一些字符串看起来像
my_index-2011

现在。回答我的问题。我有一个类似于
my_index-2011
的字符串和我的模板
'my_index-{year}'
提取
{year}
部分的巧妙方法是什么

[注意:我知道存在]

使用
split()
string函数将字符串拆分为破折号周围的两部分,然后只抓取第二部分

mystring = "my_index-2011"
year = mystring.split("-")[1]
我假设“年”是4位数,你有多个索引

import re
res = ''
patterns = [ '%s-[0-9]{4}'%index for index in idx ] 
for index,pattern in zip(idx,patterns):
    res +=' '.join( re.findall(pattern ,data) ).replace(index+'-','') + ' '
---更新---

输出

1234 1234 3456 

是的,正则表达式在这里很有用

In [1]: import re
In [2]: s = 'my_string-2014'
In [3]: print( re.search('\d{4}', s).group(0) )
2014
编辑:我应该提到你的正则表达式可以更复杂。可以拖出更特定字符串的子组件,例如:

In [4]: print( re.search('my_string-(\d{4})$', s).group(1) )
2014

考虑到您提出的问题,我认为任何“查找年份”公式都应该可以用正则表达式表示

您需要使用以“-”为单位进行拆分,然后捕获最后一个元素作为年份:

year = "any_index-2016".split("-")[-1]

由于您捕获了最后一个元素(使用-1作为索引),因此索引中可以包含连字符,您仍然可以适当地提取年份。

有一个名为的模块,它提供了与
格式()相反的功能:

使用基于Python format()语法的规范分析字符串


另外,由于您提取的是一年,另一种选择是在模糊模式下使用:

>>> from dateutil.parser import parse
>>> parse("my_index-2011", fuzzy=True).year
2011

回答得好。我想到了。当一年成为一个时间,或者格式改变或者诸如此类的事情发生时,类似的事情就会发生。我想把重点放在只使用模板来获得年度部分。如果您检查了链接,则会在这方面做得很好。我只是不想为此安装一个新的库,我想知道是否有一种巧妙的方法可以达到同样的效果。无论如何,a+1代表您。:)@黛博斯米特雷:一到新年,像这样的事情就会发生,为什么?只要基本模式保持不变(即字符串的目标部分位于破折号之后),
split()
将继续正常工作。(如果目标部分本身包含破折号,您可以告诉
split()
仅在第一个破折号上进行分割。)我为歧义道歉。比如说,我决定用“我的索引”来代替它。模板改变了,但是我们的函数没有使用它,就坏了。同样,这是一个健康的辩论,看看是否有一个好的答案。我很确定这不可能有一个“正确”的答案haha@DebosmitRay如果字符串模板可以更改,我不确定任何解决方案都是万无一失的……我喜欢这一方案背后的想法。这有点像使用“针”的长度来获得结果。我一直很喜欢过去+1我已经在John Gordon的回答中提到了这一点。打破这一点有多种方法。例如。年份更改为格式时间
hh mm
为什么在这种方法中需要for循环?例如。我认为这是个不错的主意。但是,老实说,这太过分了。字符串上带有
+=
的循环对性能有害,在循环中使用re.match也是如此+不过,我还是要为我的努力付出代价。@DebosmitRay表示同意。如果您有索引的模式,它也可以是regax。例如,如果格式总是像5个字母加“-”加4个数字index-1234=>pattern=r'\d{5}-\d{4}',因此不需要循环所有索引。我的第一个假设是所有索引都是唯一的,我不知道dateutil解析器。好字条。我对仅仅为这一项功能安装一个新的软件包有点怀疑,我想知道是否有一种漂亮的
re.match(…)
方法可以做到这一点。但是是的。似乎我会坚持使用解析模块+1.
>>> from parse import parse
>>> s = "my_index-2011"
>>> f = "my_index-{year}"
>>> parse(f, s)['year']
'2011'
>>> from dateutil.parser import parse
>>> parse("my_index-2011", fuzzy=True).year
2011