ホームページ  >  記事  >  バックエンド開発  >  Python で文字列を操作するために一般的に使用される関数とメソッドの概要を共有します。

Python で文字列を操作するために一般的に使用される関数とメソッドの概要を共有します。

高洛峰
高洛峰オリジナル
2017-03-13 15:31:191674ブラウズ

この記事では主に、Pythonでよく使用される関数の操作方法文字列の概要を共有します。これには、フォーマットされた出力や文字列の結合に関する基本的な知識も含まれます。例えば、 , このように Python という文字列は、P、y、t、h、o、n という数文字を並べただけです。この配列は非常に厳密であり、文字自体だけでなく順序も変わります。つまり、特定の文字が変更されると、その文字の順序も変更され、新しい文字列がプログラムされます。 。 弦。

Python では、文字列のような

オブジェクト

型 (リストなど、この特性を持つ他の同様のオブジェクト型が後で登場します) を総称してシーケンスと呼びます。シーケンスとはその名の通り、「順序立てた配列」のことです。 例えば、水伯梁山の108人の英雄(その中には明らかに女性がいますが、女性の男性はここから来たのですか?)は、「秩序ある配置」のシーケンスです。最年長のソン・ジャンから108番目のゴールデン・レトリバーのドゥアン・ジンズーまでランク付けされています。この配列では、各人が番号を持ち、その番号は各人に1対1に対応する。 1位はソン・ジャン、2位はルー・ジュンイー。次に、各人の名前から、その人に対応する番号もわかります。ウーソンの番号は何ですか? 14番。李逵はどこにいますか? 22番。

Python では、これらの数値には

index

と呼ばれる洗練された名前が付けられます (他の プログラミング言語 もこのように呼んでおり、これは Python に固有のものではありません)。

インデックス作成とスライス

インデックスについては、梁山英雄の例を使用して前に説明しました。 Python の例を見てみましょう:

>>> lang = "study Python"
>>> lang[0]
's'
>>> lang[1]
't'


代入ステートメントを通じて

変数

lang に割り当てられた文字列があります。この文字列の最初の単語を取得したい場合は、lang[0] を使用できます。もちろん、代入ステートメントを通じて変数 lang に文字列を指させたくない場合は、次のようにすることもできます:

>>> "study Python"[0]
's'


効果は同じです。 lang はラベルなので、「Python を勉強する」という文字列を指します。 Python に lang[0] の実行を依頼すると、上記の操作と同様に、その文字列オブジェクトに移動します。ただし、lang のような変数を使用しないと、毎回文字列全体を書き直す必要があり、非常に時間がかかります。手間を省くために、それを変数にコピーします。変数は文字列の表現です。

文字列の並べ替え方法は梁山英雄とは少し異なり、最初のものは数字の1ではなく数字の0で表されます。 Python に限らず、他の多くの言語は 0 からソートされます。なぜこれを行うのでしょうか?それがルールです。もちろん、この規定には一定の利点があります。ここでは詳しく説明しませんので、興味があれば、Google にアクセスして、これについて詳しく説明した記事を見つけてください。


0s


上面的表格中,将这个字符串从第一个到最后一个进行了排序,特别注意,两个单词中间的那个空格,也占用了一个位置。

通过索引能够找到该索引所对应的字符,那么反过来,能不能通过字符,找到其在字符串中的索引值呢?怎么找?


>>> lang.index("p")
6


就这样,是不是已经能够和梁山好汉的例子对上号了?只不过区别在于第一个的索引值是 0。

如果某一天,宋大哥站在大石头上,向着各位弟兄大喊:“兄弟们,都排好队。”等兄弟们排好之后,宋江说:“现在给各位没有老婆的兄弟分配女朋友,我这里已经有了名单,我念叨的兄弟站出来。不过我是按照序号来念的。第 29 号到第 34 号先出列,到旁边房子等候分配女朋友。”

在前面的例子中 lang[1] 能够得到原来字符串的第二个字符 t,就相当于从原来字符串中把这个“切”出来了。不过,我们这么“切”却不影响原来字符串的完整性,当然可以理解为将那个字符 t 赋值一份拿出来了。

那么宋江大哥没有一个一个“切”,而是一下将几个兄弟叫出来。在 Python 中也能做类似事情。


>>> lang
'study Python'  #在前面“切”了若干的字符之后,再看一下该字符串,还是完整的。
>>> lang[2:9]
'udy pyt'


通过 lang[2:9]要得到部分(不是一个)字符,从返回的结果中可以看出,我们得到的是序号分别对应着 2,3,4,5,6,7,8(跟上面的表格对应一下)字符(包括那个空格)。也就是,这种获得部分字符的方法中,能够得到开始需要的以及最后一个序号之前的所对应的字符。有点拗口,自己对照上面的表格数一数就知道了。简单说就是包括开头,不包括结尾。

上述,不管是得到一个还是多个,通过索引得到字符的过程,称之为切片。

切片是一个很有意思的东西。可以“切”出不少花样呢?


>>> lang
'study Python'
>>> b = lang[1:]  # 得到从 1 号到最末尾的字符,这时最后那个需要不用写
>>> b
'tudy Python'
>>> c = lang[:]  # 得到所有字符
>>> c
'study Python'
>>> d = lang[:10]  # 得到从第一个到 10 号之前的字符
>>> d
'study pyth'


在获取切片的时候,如果分号的前面或者后面的序号不写,就表示是到最末(后面的不写)或第一个(前面的不写)

lang[:10]的效果和 lang[0:10]是一样的。


>>> e = lang[0:10]
>>> e
'study pyth'


那么,lang[1:]和 lang[1:11]效果一样吗?请思考后作答。


>>> lang[1:11]
'tudy pytho'
>>> lang[1:]
'tudy python'


果然不一样,你思考对了吗?原因就是前述所说的,如果分号后面有数字,所得到的切片,不包含该数字所对应的序号(前包括,后不包括)。那么,是不是可以这样呢?lang[1:12],不包括 12 号(事实没有 12 号),是不是可以得到 1 到 11 号对应的字符呢?


>>> lang[1:12]
'tudy python'
>>> lang[1:13]
'tudy python'


果然是。并且不仅仅后面写 12,写 13,也能得到同样的结果。但是,我这个特别要提醒,这种获得切片的做法在编程实践中是不提倡的。特别是如果后面要用到循环的时候,这样做或许在什么时候遇到麻烦。

如果在切片的时候,冒号左右都不写数字,就是前面所操作的 c = lang[:],其结果是变量 c 的值与原字符串一样,也就是“复制”了一份。注意,这里的“复制”我打上了引号,意思是如同复制,是不是真的复制呢?可以用下面的方式检验一下


>>> id(c)
3071934536L
>>> id(lang)
3071934536L


id()的作用就是查看该对象在内存地址(就是在内存中的位置编号)。从上面可以看出,两个的内存地址一样,说明 c 和 lang 两个变量指向的是同一个对象。用 c=lang[:]的方式,并没有生成一个新的字符串,而是将变量 c 这个标签也贴在了原来那个字符串上了。


>>> lang = "study python"
>>> c = lang


如果这样操作,变量 c 和 lang 是不是指向同一个对象呢?或者两者所指向的对象内存地址如何呢?看官可以自行查看。

字符串基本操作
字符串是一种序列,所有序列都有如下基本操作:

  • len():求序列长度

  • :连接 2 个序列

  • : 重复序列元素

  • in :判断元素是否存在于序列中

  • max() :返回最大值

  • min() :返回最小值

  • cmp(str1,str2) :比较 2 个序列值是否相同

通过下面的例子,将这几个基本操作在字符串上的使用演示一下:

“+”连接字符串


>>> str1 + str2
'abcdabcde'
>>> str1 + "-->" + str2
'abcd-->abcde'


这其实就是拼接,不过在这里,看官应该有一个更大的观念,我们现在只是学了字符串这一种序列,后面还会遇到列表、元组两种序列,都能够如此实现拼接。

in


>>> "a" in str1
True
>>> "de" in str1
False
>>> "de" in str2
True


in 用来判断某个字符串是不是在另外一个字符串内,或者说判断某个字符串内是否包含某个字符串,如果包含,就返回 True,否则返回 False。

最值


>>> max(str1)
'd'
>>> max(str2)
'e'
>>> min(str1)
'a'


一个字符串中,每个字符在计算机内都是有编码的,也就是对应着一个数字,min()和 max()就是根据这个数字里获得最小值和最大值,然后对应出相应的字符。关于这种编号是多少,看官可以 google 有关字符编码,或者 ASCII 编码什么的,很容易查到。

比较


>>> cmp(str1, str2)
-1


将两个字符串进行比较,也是首先将字符串中的符号转化为对一个的数字,然后比较。如果返回的数值小于零,说明第一个小于第二个,等于 0,则两个相等,大于 0,第一个大于第二个。为了能够明白其所以然,进入下面的分析。


>>> ord('a')
97
>>> ord('b')
98
>>> ord(' ')
32


ord()是一个内建函数,能够返回某个字符(注意,是一个字符,不是多个字符组成的串)所对一个的 ASCII 值(是十进制的),字符 a 在 ASCII 中的值是 97,空格在 ASCII 中也有值,是 32。顺便说明,反过来,根据整数值得到相应字符,可以使用 chr():


>>> chr(97)
'a'
>>> chr(98)
'b'


于是,就得到如下比较结果了:


>>> cmp("a","b")  #a-->97, b-->98, 97 小于 98,所以 a 小于 b
-1
>>> cmp("abc","aaa") 
1
>>> cmp("a","a")
0


看看下面的比较,是怎么进行的呢?


>>> cmp("ad","c")
-1


在字符串的比较中,是两个字符串的第一个字符先比较,如果相等,就比较下一个,如果不相等,就返回结果。直到最后,如果还相等,就返回 0。位数不够时,按照没有处理(注意,没有不是 0,0 在 ASCII 中对应的是 NUL),位数多的那个天然大了。ad 中的 a 先和后面的 c 进行比较,显然 a 小于 c,于是就返回结果 -1。如果进行下面的比较,是最容易让人迷茫的。看官能不能根据刚才阐述的比较远离理解呢?


>>> cmp("123","23")
-1
>>> cmp(123,23)  # 也可以比较整数,这时候就是整数的直接比较了。
1
“*”


字符串中的“乘法”,这个乘法,就是重复那个字符串的含义。在某些时候很好用的。比如我要打印一个华丽的分割线:


>>> str1*3
'abcdabcdabcd'
>>> print "-"*20  # 不用输入很多个`-`
--------------------
len()


要知道一个字符串有多少个字符,一种方法是从头开始,盯着屏幕数一数。哦,这不是计算机在干活,是键客在干活。

键客,不是剑客。剑客是以剑为武器的侠客;而键客是以键盘为武器的侠客。当然,还有贱客,那是贱人的最高境界,贱到大侠的程度,比如岳不群之流。
键客这样来数字符串长度:


>>> a="hello"
>>> len(a)
5


使用的是一个函数 len(object)。得到的结果就是该字符串长度。


>>> m = len(a) # 把结果返回后赋值给一个变量
>>> m
5
>>> type(m)   # 这个返回值(变量)是一个整数型
<type &#39;int&#39;>


字符串格式化输出
什么是格式化?在维基百科中有专门的词条,这么说的:

格式化是指对磁盘或磁盘中的分区(partition)进行初始化的一种操作,这种操作通常会导致现有的磁盘或分区中所有的文件被清除。
不知道你是否知道这种“格式化”。显然,此格式化非我们这里所说的,我们说的是字符串的格式化,或者说成“格式化字符串”,都可以,表示的意思就是:

格式化字符串,是 C、C++ 等程序设计语言 printf 类函数中用于指定输出参数的格式与相对位置的字符串参数。其中的转换说明(conversion specification)用于把随后对应的 0 个或多个函数参数转换为相应的格式输出;格式化字符串中转换说明以外的其它字符原样输出。
这也是来自维基百科的定义。在这个定义中,是用 C 语言作为例子,并且用了其输出函数来说明。在 Python 中,也有同样的操作和类似的函数 print,此前我们已经了解一二了。

如果将那个定义说的通俗一些,字符串格式化化,就是要先制定一个模板,在这个模板中某个或者某几个地方留出空位来,然后在那些空位填上字符串。那么,那些空位,需要用一个符号来表示,这个符号通常被叫做占位符(仅仅是占据着那个位置,并不是输出的内容)。


>>> "I like %s"
&#39;I like %s&#39;


在这个字符串中,有一个符号:%s,就是一个占位符,这个占位符可以被其它的字符串代替。比如:


>>> "I like %s" % "python"
&#39;I like python&#39;
>>> "I like %s" % "Pascal"
&#39;I like Pascal&#39;


这是较为常用的一种字符串输出方式。

另外,不同的占位符,会表示那个位置应该被不同类型的对象填充。下面列出许多,供参考。不过,不用记忆,常用的只有 %s 和 %d,或者再加上 %f,其它的如果需要了,到这里来查即可。


1 2 3 4 5 6 7 8 9 10 11
t u d y l p y t h o n
占位符 说明
%s 字符串(采用 str()的显示)
%r 字符串(采用 repr()的显示)
%c 单个字符
%b 二进制整数
%d 十进制整数
%i 十进制整数
%o 八进制整数
%x 十六进制整数
%e 指数 (基底写为 e)
%E 指数 (基底写为 E)
%f 浮点数
%F 浮点数,与上相同
%g 指数(e) 或浮点数 (根据显示长度)
%G 指数(E)或浮点数 (根据显示长度)


看例子:


>>> a = "%d years" % 15
>>> print a
15 years


当然,还可以在一个字符串中设置多个占位符,就像下面一样


>>> print "Suzhou is more than %d years. %s lives in here." % (2500, "qiwsir")
Suzhou is more than 2500 years. qiwsir lives in here.


对于浮点数字的打印输出,还可以限定输出的小数位数和其它样式。


>>> print "Today&#39;s temperature is %.2f" % 12.235
Today&#39;s temperature is 12.23
>>> print "Today&#39;s temperature is %+.2f" % 12.235
Today&#39;s temperature is +12.23


注意,上面的例子中,没有实现四舍五入的操作。只是截取。

常用的字符串方法
字符串的方法很多。可以通过 dir 来查看:


>>> dir(str)
[&#39;add&#39;, &#39;class&#39;, &#39;contains&#39;, &#39;delattr&#39;, &#39;doc&#39;, &#39;eq&#39;, &#39;format&#39;, &#39;ge&#39;, &#39;getattribute&#39;, &#39;getitem&#39;, &#39;getnewargs&#39;, &#39;getslice&#39;, &#39;gt&#39;, &#39;hash&#39;, &#39;init&#39;, &#39;le&#39;, &#39;len&#39;, &#39;lt&#39;, &#39;mod&#39;, &#39;mul&#39;, &#39;ne&#39;, &#39;new&#39;, &#39;reduce&#39;, &#39;reduce_ex&#39;, &#39;repr&#39;, &#39;rmod&#39;, &#39;rmul&#39;, &#39;setattr&#39;, &#39;sizeof&#39;, &#39;str&#39;, &#39;subclasshook&#39;, &#39;_formatter_field_name_split&#39;, &#39;_formatter_parser&#39;, &#39;capitalize&#39;, &#39;center&#39;, &#39;count&#39;, &#39;decode&#39;, &#39;encode&#39;, &#39;endswith&#39;, &#39;expandtabs&#39;, &#39;find&#39;, &#39;format&#39;, &#39;index&#39;, &#39;isalnum&#39;, &#39;isalpha&#39;, &#39;isdigit&#39;, &#39;islower&#39;, &#39;isspace&#39;, &#39;istitle&#39;, &#39;isupper&#39;, &#39;join&#39;, &#39;ljust&#39;, &#39;lower&#39;, &#39;lstrip&#39;, &#39;partition&#39;, &#39;replace&#39;, &#39;rfind&#39;, &#39;rindex&#39;, &#39;rjust&#39;, &#39;rpartition&#39;, &#39;rsplit&#39;, &#39;rstrip&#39;, &#39;split&#39;, &#39;splitlines&#39;, &#39;startswith&#39;, &#39;strip&#39;, &#39;swapcase&#39;, &#39;title&#39;, &#39;translate&#39;, &#39;upper&#39;, &#39;zfill&#39;]


这么多,不会一一介绍,要了解某个具体的含义和使用方法,最好是使用 help 查看。举例:


>>> help(str.isalpha)



Help on method_descriptor:

isalpha(...)
  S.isalpha() -> bool

  Return True if all characters in S are alphabetic
  and there is at least one character in S, False otherwise.


按照这里的说明,就可以在交互模式下进行实验。


>>> "python".isalpha()  # 字符串全是字母,应该返回 True
True
>>> "2python".isalpha()  # 字符串含非字母,返回 False
False


split

这个函数的作用是将字符串根据某个分割符进行分割。


>>> a = "I LOVE PYTHON"
>>> a.split(" ")
[&#39;I&#39;, &#39;LOVE&#39;, &#39;PYTHON&#39;]


这是用空格作为分割,得到了一个名字叫做列表(list)的返回值,关于列表的内容,后续会介绍。还能用别的分隔吗?


>>> b = "www.itdiffer.com"
>>> b.split(".")
[&#39;www&#39;, &#39;itdiffer&#39;, &#39;com&#39;]


去掉字符串两头的空格

这个功能,在让用户输入一些信息的时候非常有用。有的朋友喜欢输入结束的时候敲击空格,比如让他输入自己的名字,输完了,他来个空格。有的则喜欢先加一个空格,总做的输入的第一个字前面应该空两个格。

这些空格是没用的。Python 考虑到有不少人可能有这个习惯,因此就帮助程序员把这些空格去掉。

方法是:

  1. S.strip() 去掉字符串的左右空格

  2. S.lstrip() 去掉字符串的左边空格

  3. S.rstrip() 去掉字符串的右边空格

  4. 例如:


>>> b=" hello "  # 两边有空格
>>> b.strip()
&#39;hello&#39;
>>> b
&#39; hello &#39;


特别注意,原来的值没有变化,而是新返回了一个结果。


>>> b.lstrip()  # 去掉左边的空格
&#39;hello &#39;
>>> b.rstrip()  # 去掉右边的空格
&#39; hello&#39;


字符大小写的转换

对于英文,有时候要用到大小写转换。最有名驼峰命名,里面就有一些大写和小写的参合。如果有兴趣,可以来这里看自动将字符串转化为驼峰命名形式的方法。

在 Python 中有下面一堆内建函数,用来实现各种类型的大小写转化

  • S.upper() #S 中的字母大写

  • S.lower() #S 中的字母小写

  • S.capitalize() # 首字母大写

  • S.isupper() #S 中的字母是否全是大写

  • S.islower() #S 中的字母是否全是小写

  • S.istitle()

  • 看例子:


>>> a = "qiwsir,Python" 
>>> a.upper()    # 将小写字母完全变成大写字母
&#39;QIWSIR,PYTHON&#39;
>>> a        # 原数据对象并没有改变
&#39;qiwsir,Python&#39;
>>> b = a.upper()
>>> b
&#39;QIWSIR,PYTHON&#39;
>>> c = b.lower()  # 将所有的小写字母变成大写字母
>>> c
&#39;qiwsir,Python&#39;

>>> a
&#39;qiwsir,Python&#39;
>>> a.capitalize() # 把字符串的第一个字母变成大写
&#39;Qiwsir,Python&#39;
>>> a        # 原数据对象没有改变
&#39;qiwsir,Python&#39;
>>> b = a.capitalize() # 新建立了一个
>>> b
&#39;Qiwsir,Python&#39;

>>> a = "qiwsir,github"  # 这里的问题就是网友白羽毛指出的,非常感谢他。
>>> a.istitle()
False
>>> a = "QIWSIR"    # 当全是大写的时候,返回 False
>>> a.istitle()
False
>>> a = "qIWSIR"
>>> a.istitle()
False
>>> a = "Qiwsir,github" # 如果这样,也返回 False
>>> a.istitle()
False
>>> a = "Qiwsir"    # 这样是 True
>>> a.istitle()
True
>>> a = &#39;Qiwsir,Github&#39; # 这样也是 True
>>> a.istitle()
True

>>> a = "Qiwsir"
>>> a.isupper()
False
>>> a.upper().isupper()
True
>>> a.islower()
False
>>> a.lower().islower()
True


再探究一下,可以这么做:


>>> a = "This is a Book"
>>> a.istitle()
False
>>> b = a.title()   # 这样就把所有单词的第一个字母转化为大写
>>> b
&#39;This Is A Book&#39;
>>> b.istitle()    # 判断每个单词的第一个字母是否为大写
True


join 拼接字符串

用“+”能够拼接字符串,但不是什么情况下都能够如愿的。比如,将列表(关于列表,后续详细说,它是另外一种类型)中的每个字符(串)元素拼接成一个字符串,并且用某个符号连接,如果用“+”,就比较麻烦了(是能够实现的,麻烦)。

用字符串的 join 就比较容易实现。


>>> b
&#39;www.itdiffer.com&#39;
>>> c = b.split(".")
>>> c
[&#39;www&#39;, &#39;itdiffer&#39;, &#39;com&#39;]
>>> ".".join(c)
&#39;www.itdiffer.com&#39;
>>> "*".join(c)
&#39;www*itdiffer*com&#39;



这种拼接,是不是简单呢?

以上がPython で文字列を操作するために一般的に使用される関数とメソッドの概要を共有します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。