我希望使用正则表达式来匹配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']
答案 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
作为单词边界。