137、字符串对象方法及正则表达式

2018-02-02  本文已影响0人  陈容喜

字符串对象方法

以逗号分隔的字符串可用split拆分成数段: 1.png split结合strip(用于修剪空白符(包括换行符))一起使用: 2.png 使用join方法把字符串与指定的字符拼接起来: 3.png 使用in、index和find检测子字符串: 4.png find和index的区别:如果找不到字符串,find会返回-1;index将会引发一个异常。 5.png count函数返回指定子字符串的出现次数: 6.png replace用于将指定模式替换为另一个模式: 7.png python内置的字符串方法: 8.png 9.png

正则表达式

正则表达式(通常称作regex)提供一种灵活的在文本中搜索或匹配字符串模式的方式。正则表达式是根据正则表达式语言编写的字符串。Python内置的re模块负责对字符串应用正则表达式。
re模块的函数分为三个大类:模式匹配、替换和拆分。

例如:拆分一个字符串,分隔符为数量不定的一组空白符(制表符、空格、换行符等)。描述一个或多个空白符的正则表达式是\s+: 21.png 调用re.split('\s+',text)时,正则表达式会先被编译,然后在text上调用split方法。可以使用re.compile编译regex得到一个可重用的regex对象: 22.png 使用findall方法返回的是字符串中所有的匹配项: 23.png 下面是一段文本及一条能够识别大部分电子邮件地址的正则表达式: 24.png

如果对多条字符串应用同一条正则表达式,可以通过re.compile创建regex对象,可以节省大量CPU时间。

使用search返回的是文本中第一个电子邮件地址: 25 .png regex.match则返回None,因为它只匹配出现在字符串开头的模式: 26.png 使用sub方法,将匹配到的模式替换为指定字符串,并返回所得到的新字符串: 27.png 将电子邮件地址分成3个部分:用户名、域名以及域后缀,需要将待分段的模式的各个部分用圆括号包起来,并通过groups方法返回一个由模式各段组成的元组: 28.png 对于带有分组功能的模式,findall会返回一个元组列表: 29.png sub通过\1、\2、\3的特殊符号访问各匹配项中的分组: 30.png 为各个匹配分组加上一个名称,并返回一个带有分组名称的字典: 31.png

正则表达式方法: 55.png

源码:

# coding: utf-8

# ## 字符串对象方法

# In[1]:

# 以逗号分隔的字符串可以用split拆分成数段
language = 'Python,Java, C, C++'
language.split(',')


# In[2]:

# split结合strip(用于修剪空白符(包括换行符))一起使用:
pieces = [x.strip() for x in language.split(',')]
print(pieces)


# In[3]:

# 使用join方法连接字符串
lis = ['first','second','third']
'::'.join(lis)


# ### 子字符串定位

# In[4]:

val = 'is,or,that'
'that' in val


# In[5]:

# 指出第一个出现的','在字符串中的位置
val.index(',')


# In[6]:

# find也是返回查找的第一个字符在原来字符串中的位置
val.find('or')


# ### find和index的区别

# In[7]:

val.find(':')


# In[8]:

val.index(':')


# In[9]:

# count函数返回指定字符出现的次数
val.count('t')


# In[10]:

# replace用于指定模式替换为另一个模式
val.replace(',','::')


# In[11]:

val.replace(',','')


# ## 正则表达式

# In[12]:

# 使用正则表达式拆分字符串
import re
text = 'foo  bar\t baz \tqux'
re.split('\s+',text)


# In[13]:

# 使用re.compile编译regex得到可重用的regex对象
regex = re.compile('\s+')
regex.split(text)


# In[14]:

# 使用findall方法,得到匹配regex的所有模式
regex.findall(text)


# In[15]:

# 识别电子邮件地址
text = '''Dave dave@google.com
Steve steve@gmail.com
Rob rob@gmail.com
Ryan ryan@yahoo.com
'''
pattern = r'[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'

# re.IGNORECASE的作用是使正则表达式对大小写不敏感
regex = re.compile(pattern,flags=re.IGNORECASE)

# 对text使用findall将得到一组电子邮件地址
regex.findall(text)


# In[16]:

# search返回的是文本中第一个电子邮件地址
m = regex.search(text)
print(m)


# In[17]:

text[m.start():m.end()]


# In[18]:

# regex.match只匹配出现在字符串开头的模式
print(regex.match(text))


# In[19]:

# 使用sub方法,将匹配到的模式替换为指定字符串,并返回所得到的新字符串
print(regex.sub('REDACTED',text))


# In[20]:

# 将地址分成3个部分:用户名、域名以及域后缀
pattern = r'([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})'
regex = re.compile(pattern,flags=re.IGNORECASE) 
m = regex.match('wesm@bright.net')
# 通过groups方法返回一个元组
m.groups()


# In[21]:

# 对于带有分组功能的模式,findall会返回一个元组列表
regex.findall(text)


# In[22]:

# sub通过\1、\2、\3的特殊符号访问各匹配项中的分组
print(regex.sub(r'Username:\1,Domain:\2,Suffix:\3',text))


# In[23]:

# 为各个匹配分组加上一个名称
regex = re.compile(r'''
(?P<username>[A-Z0-9._%+-]+)
@
(?P<domain>[A-Z0-9.-]+)
\.
(?P<suffix>[A-Z]{2,4})''',flags=re.IGNORECASE|re.VERBOSE)
m = regex.match('wesm@bright.net')
# 调用groupdict()返回带有分组名称的字典
m.groupdict()
上一篇 下一篇

猜你喜欢

热点阅读