正则表达式匹配1980年和2050年的

时间:2015-07-04 16:11:56

标签: python regex date

我希望使用正则表达式来匹配1980年到2050年之间的句子。

到目前为止,我使用:

def within_years(d):
    return re.search('20[0-5][0-9]', d) or re.search('19[89][0-9]', d)

现在的问题是我也匹配“22015”。

所以我想先加[^0-9],但如果它在句子的开头就不能与年份匹配。

接下来就是先加[ /-]*,但它仍然只是可选的。

一些例子:

should_match = ['2015 is a great year', 'best year: 2015']
should_not_match = ['22015 bogus', 'a2015 is not a year']

4 个答案:

答案 0 :(得分:3)

你可以对它进行机械化,并建立一系列独家替代品:

>>> r'\b({})\b'.format('|'.join([str(x) for x in range(1980, 2051)]))
'\\b(1980|1981|1982|1983|1984|1985|1986|1987|1988|1989|1990|1991|1992|1993|1994|1995|1996|1997|1998|1999|2000|2001|2002|2003|2004|2005|2006|2007|2008|2009|2010|2011|2012|2013|2014|2015|2016|2017|2018|2019|2020|2021|2022|2023|2024|2025|2026|2027|2028|2029|2030|2031|2032|2033|2034|2035|2036|2037|2038|2039|2040|2041|2042|2043|2044|2045|2046|2047|2048|2049|2050)\\b'

但就我个人而言,我会匹配四位数,并将其作为整数与目标年份进行比较:

def within_years(txt, tgt=(1980, 2050)):
    # any valid year in the text
    digits=re.findall(r'\b(\d\d\d\d)\b', txt)
    return any(tgt[0]<= int(e) <= tgt[1] for e in digits)

或者:

def within_years0(txt, tgt=(1980, 2050)):
    # first four standalone digits only
    digits=re.search(r'\b(\d\d\d\d)\b', txt)
    return bool(digits and tgt[0]<= int(digits.group(1)) <= tgt[1])

答案 1 :(得分:2)

您可以使用单个正则表达式:

(19[89][0-9]|20[0-4][0-9]|2050)

你应该在它周围添加\b边界,以确保它们周围没有任何东西:

\b(19[89][0-9]|20[0-4][0-9]|2050)\b
>>> valid_year = re.compile(r'\b(19[89][0-9]|20[0-4][0-9]|2050)\b')
>>> should_match = ['2015 is a great year', 'best year: 2015']
>>> should_not_match = ['22015 bogus', 'a2015 is not a year']
>>> for s in should_match:
        print(valid_year.search(s))

<_sre.SRE_Match object; span=(0, 4), match='2015'>
<_sre.SRE_Match object; span=(11, 15), match='2015'>
>>> for s in should_not_match:
        print(valid_year.search(s))

None
None

答案 2 :(得分:1)

您只需使用字词边界\b

return re.search(r'\b(?:2050|20[0-4][0-9]|19[89][0-9])\b', d)

答案 3 :(得分:-1)

啊我刚刚意识到我可以将句子的开头选为OR |,所以:

预先添加(^|[ /-])并附加($|[ /-])

因此答案是:

def within_years(d):
    return re.search('(^|[ /-])20[0-5][0-9]($|[ /-])', d) or re.search('(^|[ /-])19[89][0-9]($|[ /-])', d)

在此之前,我知道也可以使用/b作为单词边界。