📜  Python中的模式匹配与正则表达式(1)

📅  最后修改于: 2023-12-03 15:04:36.783000             🧑  作者: Mango

Python中的模式匹配与正则表达式

简介

正则表达式是一种文本模式,用于匹配字符序列,常用于字符串的查找、替换与验证。Python中的re模块提供了支持正则表达式的功能。

基本语法
匹配单个字符

.:匹配除了换行符之外的任意字符 []: 匹配括号中任意一个字符,例如:[abc]会匹配a、b或c [^]: 匹配不在括号中的字符,例如:[^abc]会匹配除a、b、c之外的任意字符 \d: 匹配任意数字字符,等同于[0-9] \D: 匹配任意非数字字符,等同于[^0-9] \w: 匹配任意字母、数字或下划线字符,等同于[a-zA-Z0-9_] \W: 匹配任意非字母、数字或下划线字符,等同于[^a-zA-Z0-9_] \s: 匹配任意空白字符,包括空格、制表符、换行符等等 \S: 匹配任意非空白字符

匹配多个字符

?: 匹配前面的字符0次或1次,例如:ab?c会匹配ac或abc : 匹配前面的字符0次或多次,例如:abc会匹配ac、abc、abbc等等 +: 匹配前面的字符1次或多次,例如:ab+c会匹配abc、abbc、abbbbc等等 {n}: 匹配前面的字符n次,例如:ab{2}c会匹配abbc {n,}: 匹配前面的字符至少n次,例如:ab{2,}c会匹配abb、abbb、abbbb等等 {n,m}: 匹配前面的字符至少n次,至多m次,例如:ab{2,4}c会匹配abb、abbb、abbbb

re模块的常用函数
search函数

search函数在字符串中搜索正则表达式的第一个匹配项。如果匹配成功,就返回一个匹配对象

import re

matchObj = re.search(r'abc', 'abcdef')
if matchObj:
    print("matchObj.group() : ", matchObj.group())
else:
    print("No match!!")
match函数

match函数只检测字符串开始部分是否匹配

import re

matchObj = re.match(r'abc', 'abcdef')
if matchObj:
    print("matchObj.group() : ", matchObj.group())
else:
    print("No match!!")
findall函数

findall函数返回字符串所有与正则表达式匹配的全部结果,结果为一个列表

import re

matchList = re.findall(r'ab', 'abcdababc')
print(matchList)
sub函数

sub函数用于替换字符串中与正则表达式匹配的子串,如果没有匹配成功,则返回源字符串

import re

phoneNum = "010-12345678 # 这是一个电话号码"

num = re.sub(r'#.*$', "", phoneNum)
print("telphone number : ", num)

num = re.sub(r'\D', "", phoneNum)
print("telphone number : ", num)
贪婪匹配和非贪婪匹配

正则表达式默认采用贪婪匹配,即尽可能多的匹配字符,直到匹配到不能匹配为止:

import re

matchObj = re.search(r'ab.*c', 'abcdefghijklmn')
if matchObj :
    print("matchObj.group() : ", matchObj.group())

输出结果为:'abcdefghijklmn',因为.*采用了贪婪匹配,尽可能多的匹配字符

如果要采用非贪婪匹配,需要在匹配字符之后加上?:

import re

matchObj = re.search(r'ab.*?c', 'abcdefghijklmn')
if matchObj :
    print("matchObj.group() : ", matchObj.group())

输出结果为:'abc',因为.*?采用了非贪婪匹配,尽可能少的匹配字符

总结

正则表达式是一种强大的工具,能够对字符串进行高效的匹配、查找和替换。Python中的re模块提供了完整而强大的支持。为了使用正则表达式,需要掌握基本的匹配规则、函数和语法,同时避免贪婪匹配和非贪婪匹配带来的问题。