def find_valid_dates(dt):
result = re.findall("\d{1,2}-\d{2}-\d{2,4}|\d{1,2} (?:januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december) \d{1,4}", dt)
# result = re.findall("\d{2}-\d{2}-\d{4}|[a-zA-Z]+\s+\d{4}",dt)
return result
SaaOne_msi_vervangen['valid_dates']=SaaOne_msi_vervangen['Oplossingstekst'].apply(lambda dt : find_valid_dates(dt))
我的dataframe SaaOne_msi_vervangen的“Oplossingstekst”列包含不同格式的多个日期。例如:2020年6月14日及2023年10月2日。我尝试在我的findall中使用or运算符提取这两个日期,但到目前为止,这段代码并没有提取2023年10月2日。这可能与白色空间有关。我该如何解决这个问题?
1条答案
按热度按时间uinbv5nw1#
您可能遇到的空间问题
我个人会将空间
" "
替换为\s
或\s+
。这样,您就可以匹配所有类型的空格(和新行)。但是,您可以更严格地使用 horizontal whitespace chars =\h
(在Python中似乎不可用,但等效于[\t\x{00A0}\x{1680}\x{180E}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}\x{2006}\x{2007}\x{2008}\x{2009}\x{200A}\x{202F}\x{205F}\x{3000} ]
)。名单可以减少。由您决定是否匹配它一次或多次。带捕获组的正则表达式
由于您可能需要在稍后解析日期,因此让我们在一些命名的捕获组中捕获日、月和年。我建议这样做:
我使用了这些标志:
*x=
re.VERBOSE
。extended/verbose标志允许您在正则表达式中放置一些注解。*i=
re.IGNORECASE
对于年份,我认为
\d{2,4}
不是最好的,因为它将匹配3位数,而不是真正有效的年份值。我用\d{2}|\d{4}
替换了它。我还添加了单词边界
\b
,以避免匹配“1-06-123456”的一部分,这可能是一个产品ID或其他任何东西。您可以play with this regex101并使用 Code Generator 来测试Python代码。