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]
将只取冒号后的最后一部分
。你可以试试看。