匹配除复杂正则表达式模式之外的所有内容并将其替换为 Pandas
Match everything except a complex regex pattern and replace it in Pandas
我有一个复杂的正则表达式模式来匹配 pandas df 中 csv 列的混合日期。我想用 "" 替换除正则表达式模式匹配之外的所有内容。我已经尝试了几乎所有的否定案例(^ ?! 和其他)。但我一直用“”(空字符串)替换正则表达式匹配。
我的代码:
import pandas as pd
df.read_csv('path')
df=DataFrame(df)
df.columns=['Date']
Date=df.Date
df['Date']=df['Date'].str.replace(r'^((\b(0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](0?[1-9]|1[0-2])[^\w\d\r\n:](\d{4}|\d{2})\b)|(\b(0?[1-9]|1[0-2])[^\w\d\r\n:](0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](\d{4}|\d{2})\b))','')
我的一些数据示例:
Date
21/04/2004
[N/F]
6/07/2004
{}
[N/F]
6/10/2004
16/06/2004
{}
21/06/2004
[N/F]
1/03/2018
23/03/17
{}
{}
4/04/2006
19/05/2006
"**3/04/2006/-2/06
2006**"
预期输出
21/04/2004
6/07/2004
6/10/2004
16/06/2004
21/06/2004
1/03/2018
23/03/17
4/04/2006
19/05/2006
3/04/2006
非常感谢您的帮助。非常感谢。
我稍微简化了你的正则表达式,我正在提取而不是替换:
正在将数据加载到 DataFrame:
import pandas as pd
import numpy as np
df = pd.read_csv('data.csv')
print(df)
给出:
Date
0 21/04/2004
1 [N/F]
2 6/07/2004
3 {}
4 [N/F]
5 6/10/2004
6 16/06/2004
7 {}
8 21/06/2004
9 [N/F]
10 1/03/2018
11 23/03/17
12 {}
13 {}
14 4/04/2006
15 19/05/2006
16 **3/04/2006/-2/06\n2006**
现在提取任何可以解析为日期的内容:
pattern = r'(([1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(20[01][0-9]|[0-9]{2}))'
df['extracted_date'] = df['Date'].astype(str).str.extract(pattern)[0]
df = df.fillna('')
print(df)
哪个returns:
Date extracted_date
0 21/04/2004 21/04/2004
1 [N/F]
2 6/07/2004 6/07/2004
3 {}
4 [N/F]
5 6/10/2004 6/10/2004
6 16/06/2004 16/06/2004
7 {}
8 21/06/2004 21/06/2004
9 [N/F]
10 1/03/2018 1/03/2018
11 23/03/17 23/03/17
12 {}
13 {}
14 4/04/2006 4/04/2006
15 19/05/2006 19/05/2006
16 **3/04/2006/-2/06\n2006** 3/04/2006
我有一个复杂的正则表达式模式来匹配 pandas df 中 csv 列的混合日期。我想用 "" 替换除正则表达式模式匹配之外的所有内容。我已经尝试了几乎所有的否定案例(^ ?! 和其他)。但我一直用“”(空字符串)替换正则表达式匹配。 我的代码:
import pandas as pd
df.read_csv('path')
df=DataFrame(df)
df.columns=['Date']
Date=df.Date
df['Date']=df['Date'].str.replace(r'^((\b(0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](0?[1-9]|1[0-2])[^\w\d\r\n:](\d{4}|\d{2})\b)|(\b(0?[1-9]|1[0-2])[^\w\d\r\n:](0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](\d{4}|\d{2})\b))','')
我的一些数据示例:
Date
21/04/2004
[N/F]
6/07/2004
{}
[N/F]
6/10/2004
16/06/2004
{}
21/06/2004
[N/F]
1/03/2018
23/03/17
{}
{}
4/04/2006
19/05/2006
"**3/04/2006/-2/06
2006**"
预期输出
21/04/2004
6/07/2004
6/10/2004
16/06/2004
21/06/2004
1/03/2018
23/03/17
4/04/2006
19/05/2006
3/04/2006
非常感谢您的帮助。非常感谢。
我稍微简化了你的正则表达式,我正在提取而不是替换:
正在将数据加载到 DataFrame:
import pandas as pd
import numpy as np
df = pd.read_csv('data.csv')
print(df)
给出:
Date
0 21/04/2004
1 [N/F]
2 6/07/2004
3 {}
4 [N/F]
5 6/10/2004
6 16/06/2004
7 {}
8 21/06/2004
9 [N/F]
10 1/03/2018
11 23/03/17
12 {}
13 {}
14 4/04/2006
15 19/05/2006
16 **3/04/2006/-2/06\n2006**
现在提取任何可以解析为日期的内容:
pattern = r'(([1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(20[01][0-9]|[0-9]{2}))'
df['extracted_date'] = df['Date'].astype(str).str.extract(pattern)[0]
df = df.fillna('')
print(df)
哪个returns:
Date extracted_date
0 21/04/2004 21/04/2004
1 [N/F]
2 6/07/2004 6/07/2004
3 {}
4 [N/F]
5 6/10/2004 6/10/2004
6 16/06/2004 16/06/2004
7 {}
8 21/06/2004 21/06/2004
9 [N/F]
10 1/03/2018 1/03/2018
11 23/03/17 23/03/17
12 {}
13 {}
14 4/04/2006 4/04/2006
15 19/05/2006 19/05/2006
16 **3/04/2006/-2/06\n2006** 3/04/2006