我有一个包含字符串列的数据框:
text = ['dasndljaksdhfinwejfiv 12/05/2018'', 'akdhaouiyfbh adv12.03.2019','faytdvi advonalsdnfoaidv 5/9/2019IUAYFNVVKNVAIUEHF']
我只想从中提取日期,然后添加到新列中。
我尝试了以下操作,但它只是返回列的原始字符串值:
df['date'] = df.text.replace({r"\d{2}[\/ ](\d{2}|January|Jan)[\/ ]\d{2,4}"},regex=True)
解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
您可以使用.str.extract()
,使用\d{1,2}
匹配1位数字的日期和月份,并将.
添加到定界符模式:
df['date'] = df['text'].str.extract(r"(\d{1,2}[/. ](?:\d{1,2}|January|Jan)[/. ]\d{2}(?:\d{2})?)")
请参见regex demo。
另外,请注意\d{2}(?:\d{2})?
匹配2或4位数字,而\d{2,4}
匹配2、3或4位数字。
请注意,整个正则表达式模式都用捕获组进行包装,这是有必要的,因为.str.extract
需要至少一个捕获组才能工作,它只会产生捕获的文本。
要匹配不在其他数字内的日期,可以在开头添加(?<!\d)
,在末尾添加(?!\d)
,这样可以使格式更安全。
如果您打算匹配任何英语月份的名称,则需要稍微扩展一下模式:
r"(?<!\d)(\d{1,2}[/. ](?:\d{1,2}|(?:J(?:an(?:uary)?|u(?:ne?|ly?))|Feb(?:ruary)?|Ma(?:r(?:ch)?|y)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:t(?:ember)?)?|(?:Nov|Dec)(?:ember)?|Oct(?:ober)?))[/. ]\d{2}(?:\d{2})?)(?!\d)"
详细信息
(?<!\d)
-不允许在左边立即输入数字(
-捕获组的开始\d{1,2}
-1或2位数字[/. ]
-空格,/
或.
(?:\d{1,2}|(?:J(?:an(?:uary)?|u(?:ne?|ly?))|Feb(?:ruary)?|Ma(?:r(?:ch)?|y)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:t(?:ember)?)?|(?:Nov|Dec)(?:ember)?|Oct(?:ober)?))
-月名称,是否缩写[/. ]
-空格,/
或.
\d{2}(?:\d{2})?
-2位数字,后跟两位数字的可选序列)
-捕获组的结尾(?!\d)
-不允许在右边立即输入数字