Python'replace'的行为不一致
我有一个庞大的数据库,在那里我删除了不同长度的前导文本。下面是一个简单的工作示例:Python'replace'的行为不一致,python,pandas,re,Python,Pandas,Re,我有一个庞大的数据库,在那里我删除了不同长度的前导文本。下面是一个简单的工作示例: data = {'Title' : ['Bertram, C. et al., 2015a: Carbon', 'Bertram, C. et al., 2015b: Complementing', 'Bertram, C. et al., 2018: Targeted']} df = pd.DataFrame(data, colum
data = {'Title' : ['Bertram, C. et al., 2015a: Carbon',
'Bertram, C. et al., 2015b: Complementing',
'Bertram, C. et al., 2018: Targeted']}
df = pd.DataFrame(data, columns = ['Title'])
给
Title
0 Bertram, C. et al., 2015a: Carbon
1 Bertram, C. et al., 2015b: Complementing
2 Bertram, C. et al., 2018: Targeted
第一次尝试
Title
0 Carbon
1 Complementing
2 Targeted
我将re
应用于熊猫replace
方法:
df['Title'].replace(r'(\A[\D\s.,]*\d\d\d\d[ab:] )', '', regex=True, inplace=True)
但这并不能解决所有情况:
Title
0 Bertram, C. et al., 2015a: Carbon
1 Bertram, C. et al., 2015b: Complementing
2 Targeted
第二次尝试
Title
0 Carbon
1 Complementing
2 Targeted
我在replace
中使用regex
命令:
df['Title'].replace(regex=[r'(\A[\D\s.,]*\d\d\d\d:)',
r'(\A[\D\s.,]*\d\d\d\da:)'
r'(\A[\D\s.,]*\d\d\d\db:)'], value='', inplace=True)
但这也给出了同样的结果
Title
0 Bertram, C. et al., 2015a: Carbon
1 Bertram, C. et al., 2015b: Complementing
2 Targeted
第三次尝试
Title
0 Carbon
1 Complementing
2 Targeted
如果我重新排列正则表达式列表:
df['Title'].replace(regex=[r'(\A[\D\s.,]*\d\d\d\da:)',
r'(\A[\D\s.,]*\d\d\d\db:)'
r'(\A[\D\s.,]*\d\d\d\d:)'], value='', inplace=True)
我得到了一些改进,但还不够:
Title
0 Carbon
1 Bertram, C. et al., 2015b: Complementing
2 Targeted
期望的结果
Title
0 Carbon
1 Complementing
2 Targeted
缺少相关问题
我仔细查看了
re
和panda
的replace
文档,但有些地方不对劲。所有的问答都不能接近这个问题。“[ab:]”
的意思是“或者A,或者b,或者:”。您需要“[ab:::+”
(“a,或b,或:,可能重复”),因为它们在例如“2015a:”
中重复。通过此更正,第一种方法将起作用。如果您始终在末尾使用冒号:
,并且希望在其后面有最后一个单词,则可能不希望使用re
模块。通常re比简单的字符串操作慢得多
备选方案可以是:
data = {'Title' : ['Bertram, C. et al., 2015a: Carbon',
'Bertram, C. et al., 2015b: Complementing',
'Bertram, C. et al., 2018: Targeted']}
df = pd.DataFrame(data, columns = ['Title'])
df['title2'] = df.Title.str.split(':').str[-1].str.lstrip()
print(df)
输出
0 Bertram, C. et al., 2015a: Carbon Carbon
1 Bertram, C. et al., 2015b: Complementing Complementing
2 Bertram, C. et al., 2018: Targeted Targeted
你能解释一下你想删除什么吗。我认为他真正想要的是
\d{4}[ab]:
可能,但在他们的上下文中,\d{4}[ab]:
与\d\d\d[ab:::+
没有区别,因为:总是在末尾。但是你的匹配即使一年后没有:
。正确,但在他们的例子中,总是有一个“:”一年之后。实际上,[ab:::+
和[ab]?:
都起作用了。是的,每一行都有一个:
。谢谢@Bhishan。这在我的MWE中会很好地工作,但在实际应用程序中,\d\d\d:
前后都有我不想拆分的:。部分.str[-1]
将只取冒号后的最后一部分:
。你可以试试看。