字符串的搜索与替换
-
匹配或搜索特定模式的文本
- 字符串方法
str.find(substr) 主要为查找字符串中是否出现指定模式的文本,出现,返回首个出现的位置索引,不出现,返回-1
- 字符串方法
#实例
str1="21-year-old raises half-million for polar journey for"
print(str1.find("for"))
- 较复杂时,通常使用正则表达式
re.match() 从字符串开始去匹配,匹配到返回对象,需要取出已匹配到的文本,用group()方法
re.findall() 返回匹配到的文本列表
re.finditer() 返回匹配到的文本迭代对象
re.compile() 将模式字符串预编译成模式对象,可重复使用,一次编译,多次使用,对于用同一模式匹配多个字符串的情形,非常适用,一定程度上优化了性能。
#实例
import re
str1="21-year-old raises half-million for polar journey for 32"
result= re.match(r"\w*\d+\w*",str1)
allresult=re.findall(r"\w*\d+\w*",str1)
iterresult=re.finditer(r"\w*\d+\w*",str1)
if result:
print(result.group()) #结果为21,仅匹配
首个出现文本,并返回对象
print(allresult)#结果为['21','32']
for i in iterresult:
print(i.group())
上述模式多次被重复使用,可使用compile一次编译,多次使用
#上述情形可修改为一次编译,多次利用:
str1 = "21-year-old raises half-million for polar journey for 32"
pattern=re.compile(r"\w*\d+\w*")
result=pattern.match(str1)
allresult=pattern.findall(str1)
iterresult=pattern.finditer(str1)
if result:
print(result.group())
print(allresult)
for i in iterresult:
print(i.group())
-
字符串替换
- 简单使用,字符串方法
str.replace()
- 简单使用,字符串方法
text = 'yeah, but no, but yeah, but no, but yeah'
newtext=text.replace('yeah',"new")
print(newtext)
- 复杂使用,正则表达式
re.sub() 根据正式表达式模式,匹配并替换
import re
text1 = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
newtext1=re.sub(r"(\d+)/(\d+)/(\d+)",r"\3-\1-\2",text1)
print(newtext1)#结果:Today is 2012-11-27. PyCon starts 2013-3-13.
上述例子涉及到正则表达式中的捕获分组和非捕获分组的概念
捕获组:()表示一个字表达式,捕获出符合括号内的内容,可以通过从左到右计算组编号,从而可以引用组的编号来引用前面匹配到的文本
非捕获组:以 (?) 开头的组是纯的非捕获 组,它不捕获文本 ,也不针对组合计进行计数。
常见的几种非捕获组:匹配表达式X,但是不包含表达式的文本
(?=X ) 仅当子表达式 X 在此位置的右侧时才继续匹配,例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。换言之,限制
了右侧为X时才进行匹配
(?!X ) 仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配
换言之,限制了右侧不为X时才进行匹配 。
(?<=X ) 仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。换言之,限制了左侧为X时才进行匹配
(?<!X ) 仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配。换言之,限制了左侧不为X时才进行匹配
网友评论