我正在尝试捕获表单的日期-
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])
但是在某些情况下,我也会得到前面/后面的文本.. 任何输入将不胜感激
答案 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+小写字母,可选的.
,,
,然后是空格和四位数字.*
-字符串的其余部分。