""" 模块:python3 reModule_sub.py 功能:python3 正则表达式 - 检索和替换。 参考: https://www.runoob.com/python3/python3-reg-expressions.html https://www.cnblogs.com/ssyfj/p/8522904.html 知识点: 1.re.sub(pattern, repl, string, count=0, flags=0) -> 替换后的字符串。 替换字符串中的匹配项。 pattern : 必选,正则中的模式字符串。 repl : 必选,替换的字符串,或函数。 string : 必选,要被查找替换的原始字符串。 count : 可选,模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。 flags : 可选,编译时用的匹配模式,数字形式。 运行机制: 通过patter匹配相应的字符串,并把匹配到的字符串替换成repl,或替换成repl函数返回的字符串。 repl(replacement), 替换掉 pattern 匹配到的字符串或处理 pattern 匹配到的字符串的函数。 如果 repl 是字符串,反斜杠会在其中转义。 如果 repl 是可调用的,它将传递匹配的对象,并且必须返回要使用的替换字符串。 """ import re # 1.提取电话号码。 phone = "2004-959-559 # 这是一个电话号码" # 1.1.替换注释为空。 # 匹配以"#"号开头的任意字符串直到该字符串结束。 # num = re.sub(r'#.*$', "", phone) num = re.sub(r'#.*', "", phone) print(num) # 2004-959-559 # 1.2.替换非数字内容为空。 num = re.sub(r'\D', "", phone) print(num) # 2004959559 def double(matchedObject): """ 将匹配的数字乘于 2。 :param matchedObject: 匹配到的对象。 :return: 字符串,用于替换匹配到的字符串。 """ print(matchedObject) # <re.Match object; span=(1, 3), match='23'> # <re.Match object; span=(4, 5), match='4'> # <re.Match object; span=(8, 11), match='567'> value = int(matchedObject.group('num')) return str(value * 2) # 2.将字符串中的数字乘于 2。 # r'(?P<num>\d+)'是将后面匹配的 \d+ 数据,取一个组名 num。 # 这个组名必须是唯一的,不重复的,没有特殊符号的。 # 函数可以获得这个组名下的数据。 # 一种方式是,正则匹配使用 group(组名) 可以获取到这个组名下的数据, # 类似 group(1),group(2)。 print("\n2.") s = 'A23G4HFD567' s2 = re.sub(r'(?P<num>\d+)', double, s) print(s2) # A46G8HFD1134 # 3.格式化日期。 # (),代表要提取的内容(组)。 # \1...\9,匹配第n个分组的内容。 # \d{4},表示匹配4个连续数字。 print("\n3.") s = '2017-11-27' print(re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', s)) # 11/27/2017 # 4.匹配标点符号、换行实例。 print("\n4.") s = "you're asking me out.that's so cute.what's your name again?" print(re.sub(r"([.!?])", r"\1\n", s)) # you're asking me out. # that's so cute. # what's your name again? # 5.当使用 re.sub() 的可选参数时,位置传参要传入所有可选参数。 # 或者使用关键字传参。 # re.S 即为' . '并且包括换行符在内的任意字符(' . '不包括换行符) print("\n5.") print(re.sub('123.*', '123*', '123ab\nc')) # 123* # c print(re.sub('123.*', '123*', '123ab\nc', 0, re.S)) # 123* print(re.sub('123.*', '123*', '123ab\nc', flags=re.S)) # 123* # re.compile(pattern, flags).sub(repl, string, count=0) # 返回替换后的字符串。 regex = re.compile('123.*', re.S) print(regex.sub('123*', '123ab\nc')) # 123*