从原始数据捕获特定格式的日期

时间:2019-01-23 08:57:11

标签: regex pandas

我正在尝试捕获表单的日期-

2009年4月20日

2009年4月20日

2009年4月20日

2009年4月20日

...来自熊猫数据框中的原始文本。我想除掉日期之外的其余文字

我的尝试部分成功

df['some_column'] = df['some_column'].str.replace(r'(.*?)(\d{1,2}[ ](?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\.?,?[ ]\d{4})(.*?)\n', lambda x: x.groups()[1])

但是在某些情况下,我也会得到前面/后面的文本.. 任何输入将不胜感激

1 个答案:

答案 0 :(得分:0)

对于\n\1,您只匹配后面跟第1组中捕获的文本相同的行。

您可以使用:

df['some_column'] = df['some_column'].str.replace(r'(?s).*?(\d{1,2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\.?,? \d{4}).*', r'\1')

请参见regex demo

请注意,您不需要使用lambda表达式作为替换参数,\1替换后向引用会将捕获到的文本放回第1组。

或者,使用str.extract

df['some_column'] = df['some_column'].str.extract(r'(\d{1,2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\.?,? \d{4})', expand=False)

详细信息

  • (?s)-re.DOTALL修饰符(如果有换行符)
  • .*?-任意0个以上的字符,尽可能少
  • (\d{1,2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\.?,? \d{4})-第1组:一位或两位数,空格,月份的缩写,后跟0+小写字母,可选的.,,然后是空格和四位数字
  • .*-字符串的其余部分。