原文:
www.kdnuggets.com/2020/01/python-string-processing-primer.html
自然语言处理和文本分析目前是研究和应用的热门领域。这些领域包含了各种具体的技能和概念,需要彻底理解后才能进行有意义的实践。然而,在达到这一点之前,基本的字符串操作和处理是必须的。
1. Google 网络安全证书 - 快速进入网络安全职业道路。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织在 IT 方面
我认为需要讨论两种广泛的计算字符串处理技能。第一种是 正则表达式,一种基于模式的文本匹配方法。可以寻找许多关于正则表达式的优秀介绍,但视觉学习者可能会喜欢 fast.ai 的代码优先自然语言处理课程视频。
另一种显著的计算字符串处理技能是能够利用给定编程语言的标准库进行基本字符串操作。因此,本文是一个简短的 Python 字符串处理入门。
请注意,有意义的文本分析远远超出了字符串处理,这些更高级技术的核心可能不需要你经常手动操作文本。然而,文本数据处理是成功的文本分析项目中重要且耗时的部分,以上提到的字符串处理技能在这里将非常宝贵。基本水平上理解文本的计算处理对理解更高级的文本分析技术也是概念上非常重要的。
以下许多示例使用了 Python 标准库中的 string 模块,因此手头有它作为参考是个好主意。
这个实用的备忘单包含了所有的代码在 这个可下载的 PDF 文件 中。
去除空白是基本的字符串处理需求。你可以使用 lstrip()
方法去除前导空白(左侧),使用 rstrip()
去除尾随空白(右侧),使用 strip()
去除前导和尾随空白。
s = ' This is a sentence with whitespace. \n'
print('Strip leading whitespace: {}'.format(s.lstrip()))
print('Strip trailing whitespace: {}'.format(s.rstrip()))
print('Strip all whitespace: {}'.format(s.strip()))
Strip leading whitespace: This is a sentence with whitespace.
Strip trailing whitespace: This is a sentence with whitespace.
Strip all whitespace: This is a sentence with whitespace.
对于去除空白之外的字符感兴趣?相同的方法也很有用,通过传递你希望去除的字符(们)来使用它们。
s = 'This is a sentence with unwanted characters.AAAAAAAA'
print('Strip unwanted characters: {}'.format(s.rstrip('A')))
Strip unwanted characters: This is a sentence with unwanted characters.
如果需要,请不要忘记查看字符串format()
的文档。
将字符串拆分成更小的子字符串列表在 Python 中通常是有用的,可以通过split()
方法轻松完成。
s = 'KDnuggets is a fantastic resource'
print(s.split())
['KDnuggets', 'is', 'a', 'fantastic', 'resource']
默认情况下,split()
以空白字符进行拆分,但也可以传递其他字符(们)序列。
s = 'these,words,are,separated,by,comma'
print('\',\' separated split -> {}'.format(s.split(',')))
s = 'abacbdebfgbhhgbabddba'
print('\'b\' separated split -> {}'.format(s.split('b')))
',' separated split -> ['these', 'words', 'are', 'separated', 'by', 'comma']
'b' separated split -> ['a', 'ac', 'de', 'fg', 'hhg', 'a', 'dd', 'a']
需要以上操作的相反操作吗?你可以使用join()
方法将列表元素字符串连接成一个单一字符串。
s = ['KDnuggets', 'is', 'a', 'fantastic', 'resource']
print(' '.join(s))
KDnuggets is a fantastic resource
这倒是真的!如果你想用空白之外的内容连接列表元素呢?这个可能会有点奇怪,但也很容易实现。
s = ['Eleven', 'Mike', 'Dustin', 'Lucas', 'Will']
print(' and '.join(s))
Eleven and Mike and Dustin and Lucas and Will
Python 并没有内置的字符串反转方法。然而,鉴于字符串可以像列表一样切片,反转一个字符串可以以与反转列表元素相同的简洁方式完成。
s = 'KDnuggets'
print('The reverse of KDnuggets is {}'.format(s[::-1]))
The reverse of KDnuggets is: steggunDK
转换大小写可以通过upper()
、lower()
和 swapcase()
方法完成。
s = 'KDnuggets'
print('\'KDnuggets\' as uppercase: {}'.format(s.upper()))
print('\'KDnuggets\' as lowercase: {}'.format(s.lower()))
print('\'KDnuggets\' as swapped case: {}'.format(s.swapcase()))
'KDnuggets' as uppercase: KDNUGGETS
'KDnuggets' as lowercase: kdnuggets
'KDnuggets' as swapped case: kdNUGGETS
在 Python 中检查字符串成员的最简单方法是使用 in
运算符。语法非常自然语言化。
s1 = 'perpendicular'
s2 = 'pen'
s3 = 'pep'
print('\'pen\' in \'perpendicular\' -> {}'.format(s2 in s1))
print('\'pep\' in \'perpendicular\' -> {}'.format(s3 in s1))
'pen' in 'perpendicular' -> True
'pep' in 'perpendicular' -> False
如果你更感兴趣于在字符串中查找子字符串的位置(而不是仅仅检查子字符串是否包含在其中),find()
字符串方法可能会更有帮助。
s = 'Does this string contain a substring?'
print('\'string\' location -> {}'.format(s.find('string')))
print('\'spring\' location -> {}'.format(s.find('spring')))
'string' location -> 10
'spring' location -> -1
默认情况下,find()
返回子字符串第一次出现的第一个字符的索引,如果未找到子字符串,则返回 -1
。查看文档以获取对默认行为的可用调整。
如果你想要替换子字符串,而不仅仅是查找它们呢?Python 的 replace()
字符串方法可以处理这个需求。
s1 = 'The theory of data science is of the utmost importance.'
s2 = 'practice'
print('The new sentence: {}'.format(s1.replace('theory', s2)))
The new sentence: The practice of data science is of the utmost importance.
一个可选的计数参数可以指定在相同子字符串出现多次时,进行的连续替换的最大次数。
有多个字符串列表想要按元素组合在一起?使用zip()
函数没有问题。
countries = ['USA', 'Canada', 'UK', 'Australia']
cities = ['Washington', 'Ottawa', 'London', 'Canberra']
for x, y in zip(countries, cities):
print('The capital of {} is {}.'.format(x, y))
The capital of USA is Washington.
The capital of Canada is Ottawa.
The capital of UK is London.
The capital of Australia is Canberra.
想要检查一对字符串是否是变位词吗?在算法上,我们只需统计每个字符串中每个字母的出现次数,并检查这些计数是否相等。使用Counter
类来完成这个任务非常简单。
from collections import Counter
def is_anagram(s1, s2):
return Counter(s1) == Counter(s2)
s1 = 'listen'
s2 = 'silent'
s3 = 'runner'
s4 = 'neuron'
print('\'listen\' is an anagram of \'silent\' -> {}'.format(is_anagram(s1, s2)))
print('\'runner\' is an anagram of \'neuron\' -> {}'.format(is_anagram(s3, s4)))
'listen' an anagram of 'silent' -> True
'runner' an anagram of 'neuron' -> False
如果你想检查一个单词是否是回文怎么办?在算法上,我们需要创建该单词的反向,然后使用==
运算符检查这两个字符串(原始字符串和反向字符串)是否相等。
def is_palindrome(s):
reverse = s[::-1]
if (s == reverse):
return True
return False
s1 = 'racecar'
s2 = 'hippopotamus'
print('\'racecar\' a palindrome -> {}'.format(is_palindrome(s1)))
print('\'hippopotamus\' a palindrome -> {}'.format(is_palindrome(s2)))
'racecar' is a palindrome -> True
'hippopotamus' is a palindrome -> False
确保你下载了Python 字符串处理备忘单。