首页 > 解决方案 > 为什么 pandas str.replace 用 .* 模式多次插入替换值

问题描述

我正在尝试使用 pandasstr.replace函数来替换模式。

但是当我这样做时:

pd.DataFrame({'text_col':['aaa', 'c', 'bbbbb', 'ddd']})['text_col'].str.replace('.*', 'RR')

由于某种原因它返回:

0    RRRR
1    RRRR
2    RRRR
3    RRRR
Name: text_col, dtype: object

虽然我会虽然它应该返回相同的:

pd.DataFrame({'text_col':['aaa', 'c', 'bbbbb', 'ddd']})['text_col'].str.replace('^.*$', 'RR')

返回:

0    RR
1    RR
2    RR
3    RR
Name: text_col, dtype: object

如果我将此行为与 R 编程语言进行比较,替换模式.*^.*$产生相同的结果。为什么它在 Pandas 中有所不同?

标签: pythonregexpandasreplace

解决方案


两种正则表达式模式都不同。

  • a*-> 零个或多个 a。

看看这个例子。

>>> import re
>>> re.findall('.*', 'c')
# ['c', '']

>>> re.findall('.*', 'AAAAAAA')
# ['AAAAAAA', '']

>>> re.findall('.*', '')
# [''] 
  • '.*'也匹配空字符串。_.str.replace替换每个匹配项,因此您总是得到两个匹配项,即一个是实际字符串,两个是空字符串。所以,你总是得到'RRRR'.

如果你想匹配一个或匹配字符,你可以使用下面的正则表达式。

pat = r'.{1, }'

推荐阅读