目录
- 问题
- 解决方案
- 讨论
问题
如果我们需要从一段字符串中以不区分大小写的方式做查找和替换,该怎么做?
解决方案
正则化模块 re
提供 re.IGNORECASE
标识从而实现以不区分大小写的方式做查找和替换。
查找 re.findall()
import retext = "UPPER PYTHON, lower python, Mixed Python"
res1 = re.findall('python', text)
res2 = re.findall('python', text, flags=re.IGNORECASE)
print("res1 =", res1)
print("res2 =", res2)
结果:
res1 = ['python']
res2 = ['PYTHON', 'python', 'Python']
替换 re.sub()
import retext = "UPPER PYTHON, lower python, Mixed Python"
res1 = re.sub('python', 'java', text)
res2 = re.sub('python', 'java', text, flags=re.IGNORECASE)
print("res1 =", res1)
print("res2 =", res2)
结果:
res1 = UPPER PYTHON, lower java, Mixed Python
res2 = UPPER java, lower java, Mixed java
虽然我们上述通过标识 re.IGNORECASE
以不区分大小写的方式实现了查找和替换,但是上述内容也很明显地暴露出一种局限,就是替换后的文本与被替换的内容大小写写不吻合。即 "Python"
没有被替换为 "Java"
。
为了修正这种问题,需要用到一个 支撑函数,示例如下:
import retext = "UPPER PYTHON, lower python, Mixed Python"# 构建支撑函数
def matchcase(word):def replace(m):text = m.group()if text.isupper():return word.upper()elif text.islower():return word.lower()elif text[0].isupper():return word.capitalize()else:return wordreturn replaceresult = re.sub('python', matchcase('java'), text, flags=re.IGNORECASE)
print(result)
在上述代码中,matchcase()
函数是一个高阶函数,它返回一个内部函数 replace()
。
而之所以内部函数被称为支撑函数,是因为它并不直接处理主要任务,而是协助 matchcase()
高阶函数完成其工作。
纵览全代码,内部函数、支撑函数 replace()
函数的目的是根据匹配到的文本的大小写情况来返回适当大小写的 word
,即高阶函数 matchcase()
中唯一的参数。它通过检查匹配到的文本 text
的大小写格式,即支撑函数的唯一参数,来确定返回值的大小写格式。
以上,便实现了替换文本,并保持原始文本的大小写风格的结果。
UPPER JAVA, lower java, Mixed Java
讨论
对于一般的情况,本节内容介绍的 re.IGNORECASE
标记足以以不区分大小写的方式匹配和替换字符串内容。但是需要注意的是,此方法仍然具有局限性,对于某些涉及大写转换的 Unicode 匹配来说可能是不够的。具体内容将在后续进行阐述。