rsplit函数python_【C++实现python字符串函数库】一:分割函数:split、rsplit_weixin_39747399的博客-程序员秘密

技术标签: rsplit函数python  

【C++实现python字符串函数库】split()与rsplit()方法

前言

本系列文章将介绍python提供的字符串函数,并尝试使用C++来实现这些函数。这些C++函数在这里做单独的分析,最后我们将把这些函数放在命名空间中,真正作为一个函数库来使用。

本节内容

在本节,我们将实现两个python字符串分割函数。这两个函数的函数原型为:

split(spe = None,maxsplit= -1)

rsplit(spe= None ,maxsplit = -1)

这两个方法使用参数spe作为分隔符,将字符串切割成指定的maxsplit段,并以列表的形式返回切割后的字符串。默认的分隔符是空格,默认情况下对所有的分隔符进行分割:

>>>

>>> s = "I'm not to see you"

>>> s.split()

["I'm", 'not', 'to', 'see', 'you']

>>>

>>> s.rsplit()

["I'm", 'not', 'to', 'see', 'you']

>>>

可以看到字符串根据空格进行分割,分割成的各段作为列表的元素组成了列表并返回。

我们再来看更多的例子:

分隔成指定段数

>>>

>>> s = 'aaaaaaaaaaa'

>>> s.split('a',2) #依据'a'进行分割,最大分割数为2(分割两次)

['', '', 'aaaaaaaaa']

>>>

>>>

>>> s.split('a',1000)#分隔数偏多

['', '', '', '', '', '', '', '', '', '', '', '']

>>>

>>>

>>> s.split('a',-19)#分割数为负数

['', '', '', '', '', '', '', '', '', '', '', '']

>>>

split方法从左至右处理字符串,而rsplit方法从右至左处理字符串:

>>> ##两个方法的区别

>>> s

'aaaaaaaaaaa'

>>> s.split('a',2)

['', '', 'aaaaaaaaa']

>>> s.rsplit('a',2)

['aaaaaaaaa', '', '']

>>>

C++实现

我们使用容器vector来保存字符串分割后的元素。尽管我们的目标是实现split与rsplit这两个函数,但是模块化的思想促使我们定义出以下这5个函数:

reverse_strings :用于rsplit_whitepace与rsplit函数。

split_whitespace :用于split调用,以空格作为分隔符对整个字符串做分隔处理(默认)

rsplit_whitespace :用于 rsplit调用,以空格作为分隔符对整个字符串做分隔处理(默认)

split 我们所期待的函数

rsplit 我们所期待的函数

在函数的实现中,我们会调用到C++容器提供的一些接口:vector容器的push_back,substr等。

头文件与宏定义

在这两个函数的实现中,我们需要如下头文件与宏定义:

#include

#include

#define MAX_32BIT_INT 2147483467

倒序函数reverse_strings

这个函数提供给rsplit函数使用。具体使用继续向下看。

//采用std的swap函数

void reverse_strings(std::vector< std::string > & result)

{

for (std::vector< std::string >::size_type i = 0; i < result.size() / 2; i++)

{

std::swap(result[i], result[result.size() - 1 - i]);

}

}

spilt()方法默认情况下处理函数:split_whitespace

void split_whitespace(const std::string &str, std::vector<:string> &result, int maxsplit)

{

std::string::size_type i, j, len = str.size();

for (i = j = 0; i < len;)

{

while (i < len&&::isspace(str[i]))

i++;

j = i;

while (i < len&&!::isspace(str[i]))

i++;

if (j < i)

{

if (maxsplit-- <= 0)

break;

result.push_back(str.substr(j, i - j));

while (i < len&&::isspace(str[i]))

i++;

j = i;

}

}

if (j < len)

{

result.push_back(str.substr(j, len - j));

}

}

split()函数

void split(const std::string &str, std::vector<:string>&result, const std::string &sep, int maxslit)

{

result.clear();

if (maxslit < 0)

maxslit = MAX_32BIT_INT; //MAX_32BIT_INT是自己定义的一个整数,当maxslit为负数时,对整个字符串做切割处理

//split函数默认为空格为分隔符

if (sep.size() == 0)

{

//调用函数进行空格切割

split_whitespace(str, result, maxslit);

return;

}

std::string::size_type i, j, len = str.size(), n = sep.size();

i = j = 0;

while (i + n <= len)

{

if (str[i] == sep[0] && str.substr(i, n)== sep)

{

if (maxslit-- <= 0)

break;

result.push_back(str.substr(j, i - j));

i = j = i + n;

}

else

i++;

}

//剩下部分

result.push_back(str.substr(j, len - j));

}

rsplit()方法默认情况处理函数

void rsplit_whitespace(const std::string &str, std::vector<:string>&result, int maxsplit)

{

std::string::size_type i,j,len = str.size();

for (i = j = len; i > 0;)

{

while (i > 0 && ::isspace(str[i - 1]))

i--;

j = i;

while (i > 0 && !::isspace(str[i - 1]))

i--;

if (j > i)

{

if (maxsplit-- <= 0)

break;

result.push_back(str.substr(i, j - i));

while (i > 0 && ::isspace(str[i - 1]))

i--;

j = i;

}

}

if (j > 0)

{

result.push_back(str.substr(0, j));

}

reverse_strings(result);

}

rsplit()函数

void rsplit(const std::string &str, std::vector<:string>&result, const std::string &sep, int maxsplit)

{

if (maxsplit < 0)

{

split(str, result, sep, maxsplit);

return;

}

result.clear();

if (sep.size() == 0)

{

rsplit_whitespace(str, result, maxsplit);

return;

}

std::string::size_type i, j;

std::string::size_type len = str.size();

std::string::size_type n = sep.size();

i = j = len;

while (i >= n)

{

if (str[i - 1] == sep[n - 1] && str.substr(i - 1, n) == sep)

{

if (maxsplit-- <= 0)

break;

result.push_back(str.substr(i, n));

i = j = i - n;

}

else

{

i--;

}

}

result.push_back(str.substr(0, j));

reverse_strings(result);

}

测试

string s = "I'm not to see you";

vector result;

string sep = " ";

split(s,result,sep,10);

结果:

string b = "abc abc abc abc";

vectorresult;

string sep = "a";

split(b, result, sep, 2);

for (int i = 0; i < result.size(); i++)

cout << result[i] << endl;

结果:

string b = "abc abc abc abc";

vectorresult;

string sep = "a";

rsplit(b, result, sep, 2);

for (int i = 0; i < result.size(); i++)

cout << result[i] << endl;

结果:

感谢耐心看完,如果有错误的地方,恳请指出。希望喜欢C++与python的同学多交流。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39747399/article/details/110769184

智能推荐

基于Recorder.js 和百度平台的语音识别功能实现_recordjs baidu 语音识别_优秀是不可能的的博客-程序员秘密

基于Recorder.js 和百度平台的语音识别功能实现1.准备工作下载Recorder.js , 实现录音功能,做准备,在Gitee 上搜索Recorder.js ,会出现很多搜索结果,我推荐两个人的,第一个是超级清晰的介绍了Recorder.js 属性、事件等 清晰版本点此下载。还有一个是比较实用的版本实用版本点此下载,很多初始化比较方便、API也很好懂,比较适合第一次写的同学。打开VS,创建一个Web项目,在项目里面创建一个HTML文件(服务器控件太慢了,不想使用)。我用的是实用版本的,

win10系统excel2019计算两个日期相差具体天数时分秒方法_wind10excel天数差计算公式_一切V随缘的博客-程序员秘密

描述:win10系统excel2019计算两个日期相差具体天数时分秒方法步骤:原数据计算两个日期相差时间选择结果,右键设置单元格格式选择数字-&gt;自定义-&gt;类型输入d h:mm:ss-&gt;确定计算结果即为两个日期相差时间...

CVPR2021提出的一些新数据集汇总_CV技术指南(公众号)的博客-程序员秘密

前言在《论文创新的常见思路总结》(点击标题阅读)一文中,提到过一些新的数据集或者新方向比较容易出论文。因此纠结于选择课题方向的读者可以考虑以下几个新方向。文末附相关论文获取方式。本文来自公众号CV技术指南的技术总结系列关注公众号CV技术指南 ,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读。一些新发布的数据集可以提供一个窗口,通过这些数据集可以了解试图解决的问题的复杂程度。公共领域中新发布的数据集可以很好地代表理解计算机视觉的发展以及有待解决的问题的新途径。本文简要总结.

【集群部署】Windows下Apache2.4负载均衡+Tomcat7集群+session共享_KerbalH的博客-程序员秘密

一、准备工具:Apache2.4,JDK1.7,Tomcat7(最少两个)二、Apache安装好后配置1.首先打开一些必要的Module注释(把前面的#号去掉就行),在conf/httpd这个文件中LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_ajp_module modules/mod_proxy_ajp.soLoa...

MyBatis一次执行多条SQL语句配置_Hi-Darling的博客-程序员秘密

需要在数据库连接参数加上allowMultiQueries=true

随便推点

java学生成绩管理系统不使用数据库_java学生成绩管理系统(不用数据库,用txt),写出来有报酬..._龙一歌的博客-程序员秘密

1、问题描述设计一个学生成绩管理系统,通过此系统可以实现如下功能:(1)能输入并显示n个学生信息和m门考试科目的成绩,计算各个学生的总分和平均分,结果写入原始数据文件并按格式打...1、问题描述设计一个学生成绩管理系统,通过此系统可以实现如下功能:(1) 能输入并显示n个学生信息和m门考试科目的成绩,计算各个学生的总分和平均分,结果写入原始数据文件并按格式打印在屏幕上;(成绩查看1)(2) 任意输...

spring知识点_无中生有之冰山一角的博客-程序员秘密

Spring1.1、简介Spring:春天------&gt;给软件行业带来了春天2002,首次推出了Spring框架的雏形:interface 21框架!Spring框架即以interface21框架为基础,经过重新设计,并不断丰富内涵,于2004年3月24日,发布了1.0正式版。Rod Johnson,Spring Framework创始人spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!SSH : Struct2 + Spring

Word、Excel、PPT 等文件在线预览_文件excel word 预览 开源_Jum朱的博客-程序员秘密

一个超级简单的方法,直接使用第三方接口即可。一个快速的解决方法:如果项目需求只要求预览内容而不要求对文档进行编辑的操作,则可以选择在线预览的方式进行处理;现附上两个在线预览office文档的地址:(浏览器都需要chrome的内核)1、 https://docs.google.com/viewer?url=(输入你的文档在服务器中的地址)2、 https://view.offi...

Data_yby06的博客-程序员秘密

数据处理Tedu Python 教学部Author:吕泽文章目录数据处理数据处理1. 文件处理1.1 引入1.2 文件读写操作1.2.1 打开文件1.2.2 读取文件1.2.3 写入文件1.2.4 关闭文件1.2.5 with操作1.2.6 缓冲区1.2.7 文件偏移量1.3 os模块2. 正则表达式2.1 概述2.2 元字符使用2.3 匹配规则2.3.1 特殊字符匹配2.3.2 贪婪模式和非贪婪模式2.3.3 正则表达式分组2.3.4 正则表达式匹配原则2.4 Python r

Android 9.0 (P版本) 亮度控制接口变更_法迪的博客-程序员秘密

1. Android 9.0 之前的亮度控制接口import android.os.IPowerManager;import android.provider.Settings;import android.content.Context; /** * Used by the settings application and brightness control wid...

第05章-可视化技术(3)_weixin_30487317的博客-程序员秘密

【译者:这个系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),因为时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容。敬请期待^_^。欢迎转载。另请转载时注明本文出处。谢谢合作!同一时候,因为译者水平有限,出错之处在所难...

推荐文章

热门文章

相关标签