python string split_python--string--split

晚上在看《python核心编程》,看到字符串的时候。突然想到了字符串的一些神奇的地方,比如字符串是不可变类型的,字符串的切片,最最让我们熟悉的便是字符串的“+”操作了。在C#中,string相加,会产生一个新的string来存放结果。以前常常也使用“+”操作,觉得这样简单方便。但有次被老师“教育”了后,几乎就很少再这么用了。当然,python中字符串的“+”,也是这样,因为字符串是不可变类型。

大家都知道,python是用C编写的,所以python中称的“万物皆对象”的“PyObject”就是一个结构体了,不知道我这么说,会不会被骂(害羞)。那自然地,python中的字符串,也就是“PyStringObject”了。python源码中关于“PyStringObject”的定义如下:

typedef struct{

PyObject_VAR_HEADlongob_shash;intob_sstate;char ob_sval[1];/*Invariants:

* ob_sval contains space for 'ob_size+1' elements.

* ob_sval[ob_size] == 0.

* ob_shash is the hash of the string or -1 if not computed yet.

* ob_sstate != 0 iff the string object is in stringobject.c's

* 'interned' dictionary; in this case the two references

* from 'interned' to this object are *not counted* in ob_refcnt.*/} PyStringObject;

PyStringObject

晕倒,我貌似跑题了!!!!!!(害羞)

其实,晚上想做的笔记,也是由于跑题引起的。原本看源码,是打算看看字符串的切片跟“+”操作的。但是,当打开“stringobject.h”,从上往下看下去时,却在无意中看到了“string_split”方法。喔!!!my 嘎登!!!这不是我以前一直困惑的么,string的split操作!!!!一直以为split操作应该类似于这样:

///

///实现string.split()///

///

///

///

public List Split(string strMain, charc)

{var list = new List();var strBuilder = newStringBuilder();foreach (var item instrMain)

{if (item !=c)

{

strBuilder.Append(item);

}else{

list.Add(strBuilder.ToString());

strBuilder= newStringBuilder();

}

}if (!string.IsNullOrEmpty(strBuilder.ToString()))

{

list.Add(strBuilder.ToString());

}returnlist;

}///

///Split 的测试///

[TestMethod()]public voidSplitTest()

{

MyString target= new MyString(); //TODO: 初始化为适当的值

string strMain ="Hello World!"; //TODO: 初始化为适当的值

char c = ' '; //TODO: 初始化为适当的值

List expected = new List() { "Hello","World!"}; //TODO: 初始化为适当的值

Listactual;

actual=target.Split(strMain, c);

CollectionAssert.AreEqual(expected, actual);

}

Split

于是,我便把原来需要寻找的某个目标,给抛到了脑后(对不起!!!)。专心的看起来split的操作,以了多年来的心愿。废话不多说,先上代码!!!

PyDoc_STRVAR(split__doc__,"S.split([sep [,maxsplit]]) -> list of strings\n\

\n\

Return a list of the wordsin the string S, using sep asthe\n\

delimiterstring. If maxsplit isgiven, at most maxsplit\n\

splits are done. If sepis not specified or isNone, any\n\

whitespacestring isa separator and empty strings are removed\n\from the result.");

static PyObject *string_split(PyStringObject*self, PyObject *args)

{

Py_ssize_t len=PyString_GET_SIZE(self), n;

Py_ssize_t maxsplit= -1;const char *s = PyString_AS_STRING(self), *sub;

PyObject*subobj =Py_None;if (!PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit))returnNULL;if (maxsplit < 0)

maxsplit=PY_SSIZE_T_MAX;if (subobj ==Py_None)return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);if(PyString_Check(subobj)) {

sub=PyString_AS_STRING(subobj);

n=PyString_GET_SIZE(subobj);

}

#ifdef Py_USING_UNICODEelse if(PyUnicode_Check(subobj))return PyUnicode_Split((PyObject *)self, subobj, maxsplit);#endif

else if (PyObject_AsCharBuffer(subobj, &sub, &n))returnNULL;return stringlib_split((PyObject*) self, s, len, sub, n, maxsplit);

}

string_split

看了“PyDoc_STRVAR”,明知道这个就是python中“help”关于“split”的介绍,我还是很贱的验证了下(我都想抽自己)。我真贱!!!

继续看代码,当看到“PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit)”的时候,又二了,这个函数是啥意思?由于用的是VS看的源码,所以本能的、很贱的直接F12了。(由于现在主语言还是C#,所以感觉VS用的熟,也就用来看python源码了)一直F12,越F12,感觉自己越二(因为看不懂啊!!!!!)索性,直接网上百度google之。想不到,还真有!!!!哎!!!感谢牛人们啊!!!!直接上介绍!!!

ThePyArg_ParseTuple()function is declared as follows:

int PyArg_ParseTuple(PyObject *arg, char *format, ...);

The arg argument must be a tuple object containing an argument list passed from Python to a C function. The format argument must be a format string, whose syntax is explained below. The remaining arguments must be addresses of variables whose type is determined by the format string. For the conversion to succeed, the arg object must match the format and the format must be exhausted.

由于本人英语实在不咋地,虽然自己看得懂,但实在是不敢翻译,怕误导了大家。还是看英文吧!!!

然后又是一阵F12,终于到了“stringlib_split((PyObject*) self, s, len, sub, n, maxsplit)”,然后又是一阵猛戳F12,

Py_LOCAL_INLINE(PyObject *)

stringlib_split(PyObject*str_obj,const STRINGLIB_CHAR*str, Py_ssize_t str_len,const STRINGLIB_CHAR*sep, Py_ssize_t sep_len,

Py_ssize_t maxcount)

{

Py_ssize_t i, j, pos, count=0;

PyObject*list, *sub;if (sep_len == 0) {

PyErr_SetString(PyExc_ValueError,"empty separator");returnNULL;

}else if (sep_len == 1)return stringlib_split_char(str_obj, str, str_len, sep[0], maxcount);

list=PyList_New(PREALLOC_SIZE(maxcount));if (list ==NULL)returnNULL;

i= j = 0;while (maxcount-- > 0) {

pos= fastsearch(str+i, str_len-i, sep, sep_len, -1, FAST_SEARCH);if (pos < 0)break;

j= i +pos;

SPLIT_ADD(str, i, j);

i= j +sep_len;

}

#ifndef STRINGLIB_MUTABLEif (count == 0 &&STRINGLIB_CHECK_EXACT(str_obj)) {/*No match in str_obj, so just use it as list[0]*/Py_INCREF(str_obj);

PyList_SET_ITEM(list,0, (PyObject *)str_obj);

count++;

}else

#endif{

SPLIT_ADD(str, i, str_len);

}

FIX_PREALLOC_SIZE(list);returnlist;

onError:

Py_DECREF(list);returnNULL;

}

stringlib_split

#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v))

哈哈!大家都看到了吧,最后,字符串转换成了list,然后再替换,所以才会有介绍中的“list of strings”。

由于不敢误人子弟,而且自己的理解也不是很到位,所以就只能做一名忠诚的拷贝党了!!!! 当然,这主要还是写给自己看,我想看得人基本上也不多,所以也就无所谓了。为了省篇幅,还受日常编码的影响,所以代码喜欢收起来。若有哪位,不小心赏光看本文的话,给您造成的不便,小的我在此三拜道歉了!!!!

由于各种跑题,所以原目标还是没完成,留在明天再做笔记吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值