我在弄清楚python的外观时遇到了一些麻烦。更具体地说,我的文本具有(mm/dd/yyyy)
(mm-dd-yyyy)
格式的日期,仅在(yyyy)
格式的几年中:
Jan-01-2001
Jan 01 2001
2003 2007
The year was 2009 when x decided to work for Google
仅提取具有yyyy
的行的最佳匹配方法。我应该能够提取2003
,2007
和2009
,但没有其他日期,例如Jan-01-2001
和Jan 01 2001
。我尝试了 lookbehind 运算符,我能带来的最好的是((?<!(-| ))d{4})
。但这仅选择2003
和不是 2007
和2009
。我还尝试使用 groups 来定义日期模式,并与 lookbehind 一起使用它们,但这不起作用。在正则表达式(Python)
简介
这仅适用于您提出的样品字符串(在不在一年之前没有2位数字的情况下,然后是空间或连字符)。假设所有日期都使用2位数字来定义一个月的一天,则对您有用(因为python中的lookbehinds(以及大多数Regex引擎)无法量化)。
代码
请参阅此处使用的正则
b(?<!bd{2}[ -])d{4}b
结果
输入
Jan-01-2001
Jan 01 2001
2003 2007
The year was 2009 when x decided to work for Google
输出
2003
2007
2009
说明
-
b
断言作为单词边界的位置 -
(?<!bd{2}[ -])
负外观确保前面的内容与以下内容不匹配-
b
断言作为单词边界的位置 -
d{2}
恰好匹配2位数字 -
[ -]
匹配空格或连字符
d{4}
字符
-
-
b
完全匹配4位数字 - CC_22断言作为单词边界的位置
I hope this may help you:
import re
string = """Jan-01-2001
Jan 01 2001
2003 2007
The year was 2009 when x decided to work for Google"""
for year in string.split('n'):
search_date = re.search(r'^(?!w{3}(?:s+|-)d{2}(?:s+|-)d{4}).+',year)
if search_date:
print(re.findall(r'd{4}',search_date.group()))