python - 为什么 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 中有所不同?
解决方案
两种正则表达式模式都不同。
a*
-> 零个或多个 a。
看看这个例子。
>>> import re
>>> re.findall('.*', 'c')
# ['c', '']
>>> re.findall('.*', 'AAAAAAA')
# ['AAAAAAA', '']
>>> re.findall('.*', '')
# ['']
'.*'
也匹配空字符串。_.str.replace
替换每个匹配项,因此您总是得到两个匹配项,即一个是实际字符串,两个是空字符串。所以,你总是得到'RRRR'
.
如果你想匹配一个或匹配字符,你可以使用下面的正则表达式。
pat = r'.{1, }'
推荐阅读
- asp.net-core-mvc - 如何在我的 .Net Core 2.1 web api 控制器中实现 Post([FromBody] IMessage msg)?
- api - 如何使用 Shopify api 为订单创建履行服务?
- git - 迁移多个 Git 存储库的更简单方法?
- java - 错误“kafkaconsumer 类型不是通用的,它不能用参数进行参数化”
- selenium - 尽管将焦点切换到它,但无法在弹出窗口中定位元素,硒
- reporting-services - 当您分离然后重新附加项目集合时,TFS 2015 报告服务器会发生什么情况?
- css - 如何淡出渐变中的背景图像,以便看到其下方的元素?
- machine-learning - 泰坦尼克号:灾难中的机器学习
- css - CSS 变换比例截断图像
- logstash - 如何使用动态索引映射将 CSV 提供给 logstash