Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 月份和年份的正则表达式(不包括某些单词)_Python_Regex - Fatal编程技术网

Python 月份和年份的正则表达式(不包括某些单词)

Python 月份和年份的正则表达式(不包括某些单词),python,regex,Python,Regex,我正在尝试制作一个正则表达式,它能够处理输入,如bellow,以提取月份和年份,同时处理所有这些不同的情况,并提取两组(开始和结束),如下所示: From August 2017 - September 2018 (output: {August 2017},{September 2018}) From August to September 2018 (output: {August},{September 2018}) July 2009 - August 2019

我正在尝试制作一个正则表达式,它能够处理输入,如bellow,以提取月份和年份,同时处理所有这些不同的情况,并提取两组(开始和结束),如下所示:

From August 2017 - September 2018   (output: {August 2017},{September 2018})
From August to September 2018       (output: {August},{September 2018})
July 2009 - August 2019             (output: {July 2009},{August 2019})
De Aout 2019 a July 2020            (output: {Aout 2019},{July 2020})
De Juillet a Aout 2020              (output: {Juillet},{Aout 2020})
Juillet - Aout 2019                 (output: {Juillet},{Aout 2019})
Juillet a Aout 2019                 (output: {Juillet},{Aout 2019})
我发现这个正则表达式做得很好():

我认为,排除/忽略“From”和“De”这样的特定词语是缺少一部分的


有什么想法或解决方案吗?

请注意,
\D+
是一种非常通用的模式,它将2018年8月至9月的
中的
匹配,即任何1+非数字符号。而且,
\w
匹配字母、数字和
\uu
s,当您需要匹配月份名称时,只匹配字母可能更合适,为此,您只需从中减去
\d
[^\w\ud]

您可以使用更精确的正则表达式:

(?P<fmonth>[^\W\d_]+(?:\W+\d+)?)\s+(?:to|a|-)\s+(?P<smonth>[^\W\d_]+\W+\d+)
(?P[^\W\d.]+(?:\W++\d+)\s+(?:to | a |-)\s+(?P[^\W\d.]+\W++\d+)

详细信息

  • (?P[^\W\d\]+(?:\W+\d+)
    -每月组:1+个字母和1+个非单词字符的可选序列,后跟1+个数字
  • \s+
    -1+空格
  • (?:to | a |-)
    -
    to
    a
    -
  • \s+
    -1+空格
  • (?P[^\W\d\]+\W+\d+)
    -smonth组:1+字母,1+非单词字符,1+数字

如果您愿意超越regex,我可以推荐Duckling-?你也可以在这里试试-。它从2018年8月到9月运行良好。可能需要一些调整,但这是一个好的开始:
(\w+(?:\d{4})(?:-|到| a)(\w+\d{4})
。看这里:@borancar我试过Duckling。。这是一个很好的建议。我以前从未见过它。但不幸的是,它不能很好地处理法语,这对我来说很重要
De Juillet a Aout 2020
From August to September 2018
(?P<fmonth>[^\W\d_]+(?:\W+\d+)?)\s+(?:to|a|-)\s+(?P<smonth>[^\W\d_]+\W+\d+)