• 【Python】正则表达式及re模块


    活动地址:CSDN21天学习挑战赛

    **

    学习日记 Day1

    **

    正则表达式被用来处理字符串,用来检查一个字符串是否与定义的字符序列的某种模式匹配。

    1. 正则表达式语法

    如下是正则表达式模式语法中的特殊元素。(re表示自己写的某一个具体匹配模式)

    模式描述
    ^匹配字符串的开头
    $匹配字符串的结尾
    .匹配除 "\n" 之外的任何单个字符。"[.\n]"可以匹配包括 “\n"在内的任何字符
    [...]表示一组字符,单独列出;如[amk]匹配 'a'、'm'或'k'
    [^...]匹配不在[]中的字符;如[^abc]表示匹配除了a,b,c之外的字符
    re*匹配0个或多个表达式
    re+匹配1个或多个表达式
    re?匹配0个或1个片段,非贪婪方式
    re{n}匹配n个表达式;如 ”o{2}"可以匹配“food",不能匹配”Bob
    re{n,}精确匹配n个表达式;如 "o{2}"不能匹配“Bob",可以匹配"fooooood"中的所有"o"
    re{n,m}匹配n到m次正则表达式定义的片段,贪婪方式
    'ab'
    (re)匹配括号内的表达式,也表示一个组
    (?imx)正则表达式包含三种可选标志:i、m、x,只影响括号中的区域
    (?-imx)正则表达式关闭i、m或x可选标志,只影响括号中的区域
    (?:re)类似(...),不表示一个组
    (?imx:re)在括号中使用i,m或x可选标志
    (?-imx:re)在括号中不使用i,m或x可选标志
    (?#...)注释
    (?=re)前向肯定界定符。如果所含正则表达式,以...表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
    (?!re)前向否定界定符,与肯定界定符相反;当所含表达式不能再字符串当前位置匹配时成功。
    (?>re)匹配的独立模式,省去回溯
    \w匹配包括下划线的任何单词字符。等价于'[A-Aa-z0-9_]'
    \W匹配任何非单词字符,等价于'[^A-Za-z0-9_]'
    \s匹配任何空白字符,包括空格、制表符、换页符等等,等价于 '[\f\n\r\t\v]'
    \S匹配任何非空白字符,等价于 '[^\f\n\r\t\v]'
    \d匹配任意数字,等价于'[0-9]'
    \D匹配一个非数字字符,等价于 '[^0-9]'
    \A匹配字符串开始
    \Z匹配字符串结束,如果存在换行,只匹配到换行前的结束字符串
    \z匹配字符串结束
    \G匹配最后匹配完成的位置
    \b匹配一个单词边界,即指单词和空格间的位置。例如, 'er\b' 可以匹配 ‘never’中的'er',但不能匹配 'verb'中的'er'
    \B匹配非单词边界,例如, 'er\b' 不能匹配 ‘never’中的'er',可以匹配 'verb'中的'er'
    \n、\t等匹配一个换行符,匹配一个制表符等
    \1...\9匹配第n个分组的内容
    \10匹配第n个分组的内容,如果它已经匹配,则指的是八进制字符码的表达式

    正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位OR(|)指定。如re.I | re.M表示被设置成I和M标志。

    修饰符描述
    re.I使匹配对大小写不敏感
    re.L做本地化识别匹配
    re.M多行匹配,影响^ $
    re.S使 . 匹配包括换黄在内的所有字符
    re.U根据Unicode字符集解析字符。这个标志影响\w,\W,\b,\B
    re.X该标志通过给予更灵活的格式使正则表达式写得更易于理解

    正则表达式从左到右计算,并遵循优先级顺序,与算数算术表达式类似。
    正则表达式运算符的优先级顺序如下:

    运算符描述
    \转义符
    (),(?;),(?=),[]圆括号和方括号
    *,+,?,{n},{n,},{n,m}限定符
    ^,$,\任何元字符、任何字符定位点和序列,即位置和顺序

    2. python中的正则表达式re模块

    python中通过正则表达式对字符串进行匹配时,需要导入re模块,调用模块中的函数进行匹配操作。

    2.1 re.match()匹配起始位置

    首先需要导入re模块,然后使用re.match()进行匹配操作。最后提取数据。如下:

    1. # 1. 导入python的正则表达式模块:re
    2. import re
    3. # 2. 使用match()方法进行匹配
    4. result = re.match(正则表达式,要匹配的字符串)
    5. # 3. 如果匹配到数据,使用group()提取数据
    6. result.group()

    简单使用示例:

    1. import re
    2. result = re.match("pyth","python")
    3. print(result.group()) # 输出 pyth
    4. result = re.match("thon","python")
    5. if result is None:
    6. print("模式没有找到匹配的字符串") # 输出 模式没有找到匹配的字符串
    7. else:
    8. print(result.group())

    re.match()函数尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None。

    re.match(pattern,string,flags=0)
    • 参数pattern表示匹配的正则表达式;
    • 参数string表示要匹配的字符串;
    • 参数flags表示标志位,用于控制正则表达式的匹配方式(re.I、re.M等),如:是否区分大小写,多行匹配等。

    2.2. re.search()匹配整个字符串

    re.search()扫描整个字符串并返回第一个成功的匹配;匹配成功返回一个匹配的对象,否则返回None。

    re.search(pattern,string,flags=0)
    • 参数pattern:匹配的正则表达式
    • 参数string:要匹配的字符串
    • 参数flags:标志位,用于控制正则表达式的匹配方式,比如是否区分大小写,多行匹配等

    与re.match()相比,re.search()匹配整个字符串,直到找到一个匹配;re.match()只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None。二者区别示例如下:

    1. # re.match() 与 re.search()的区别
    2. s = "Tell me about it!"
    3. ret_match = re.match("about",s,re.I)
    4. ret_search = re.search("about",s,re.I)
    5. if ret_match:
    6. print("re.match()匹配:",ret_match.group())
    7. else:
    8. print("re.match()不匹配")
    9. if ret_search:
    10. print("re.search()匹配:",ret_search.group())
    11. else:
    12. print("re.search()不匹配")

    2.3. re.findall()匹配所有

    re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

    re.findall()返回的是列表类型,不能使用group()函数获取到匹配的内容。

    re.findall(pattern, string, flags=0)
    • 参数pattern:匹配的正则表达式
    • 参数string:要匹配的字符串
    • 参数flags:标志位,用于控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。

    与re.match()、re.search()相比,re.findall()匹配所有,前两个函数匹配一次。

    1. s = "jack= 23,mark = 24,mary =25"
    2. reg = "\d+"
    3. ret = re.match(reg,s,re.I)
    4. print("re.match()",end=" ")
    5. if ret:
    6. print(f"MATCH: {ret.group()}")
    7. else:
    8. print("NOT MATCH!!!")
    9. ret = re.search(reg,s,re.I)
    10. print("re.search()",end=" ")
    11. if ret:
    12. print(f"MATCH: {ret.group()}")
    13. else:
    14. print("NOT MATCH!!!")
    15. ret = re.findall(reg,s,re.I)
    16. print("re.findall()",end=" ")
    17. if ret:
    18. print(f"MATCH: {ret}")
    19. else:
    20. print("NOT MATCH!!!")

    显示结果:

    re.match() NOT MATCH!!!
    re.search() MATCH: 23
    re.findall() MATCH: ['23', '24', '25']

    如果有多个匹配模式,返回元组列表

    1. s = "jack= 23,mark = 24,mary =25"
    2. reg = r"(\w+)\s?=\s?(\d+)"
    3. ret = re.findall(reg,s,re.I)
    4. if ret:
    5. print(f"MATCH: {ret}") # 匹配,输出MATCH: [('jack', '23'), ('mark', '24'), ('mary', '25')]
    6. else:
    7. print("NOT MATCH!!!")

    2.4 re.sub()匹配并替换

    re.sub()将匹配到的数据进行替换。返回替换后的字符串

    re.sub(pattern,repl,string,count=0,flags=0)
    • 参数pattern:正则中的模式字符串
    • 参数repl:替换的字符串,也可为一个函数
    • 参数string:要被查找替换的原始字符串
    • 参数count:模式匹配后替换的最大次数,默认0表示替换所有的匹配
    • 参数flags:编译时用的匹配模式,如是否区分大小写,多行匹配等

    使用示例:

    1. # re.sub() 使用
    2. s = "0700-123456 # 带区号的电话号码"
    3. reg = r"#.*$"
    4. ret = re.sub(reg,"",s,count=0,flags=re.I)
    5. if ret:
    6. print(f"MATCH: {ret}")
    7. else:
    8. print("NOT MATCH!!!")
    9. reg = r'\D' # 移除非数字的部分
    10. ret = re.sub(reg,"",s,count=0,flags=re.I)
    11. if ret:
    12. print(f"MATCH: {ret}")
    13. else:
    14. print("NOT MATCH!!!")
    15. def double(matched):
    16. '''
    17. 将匹配的数字乘以2
    18. return : 返回匹配到的数字*2
    19. '''
    20. value = int(matched.group("name"))
    21. return str(value*2)
    22. s = "A23D34F56G67"
    23. reg = "(?P\d+)"
    24. ret = re.sub(reg,double,s,count=0)
    25. if ret:
    26. print(f"MATCH: {ret}")
    27. else:
    28. print("NOT MATCH!!!")

    显示结果:

    MATCH: 0700-123456
    MATCH: 0700123456
    MATCH: A46D68F112G134

    2.5 re.split()匹配并切割

    re.split()函数根据匹配进行切割字符串,并返回一个列表;如果找不到匹配的字符串,re.split()不会对其分割。

    re.split()返回的是一个列表,不能使用group()获取匹配的内容。

    re.split(pattern,string,maxsplit=0,flags=0)
    • 参数pattern:匹配的正则表达式
    • 参数string:要匹配的字符串
    • 参数maxsplit:分割次数,maxsplit=1分割1次,默认为0,表示不限制次数
    • 参数flags:标志位,用于控制正则表达式的匹配当时,如是否区分大小写,多行匹配等
    1. s = "info: CSDN python Regular_regpression"
    2. reg = r":| "
    3. ret = re.split(reg,s,maxsplit=0)
    4. if ret:
    5. print(f"MATCH: {ret}")
    6. print(type(ret))
    7. else:
    8. print("NOT MATCH!!!")
    9. reg = "-"
    10. ret = re.split(reg,s,maxsplit=0)
    11. if ret:
    12. print(f"MATCH: {ret}")
    13. print(type(ret))
    14. else:
    15. print("NOT MATCH!!!")

    显示结果:

    MATCH: ['info', '', 'CSDN', 'python', 'Regular_regpression']

    MATCH: ['info: CSDN python Regular_regpression']

    3. 正则表达式匹配介绍

    3.1 匹配单个字符

    匹配单个字符可以选择如下的模式:

    • .        匹配任意1个字符,除了\n
    • []       匹配[]中列举的字符
    • \d      匹配数字,即[0-9]
    • \D      匹配非数字,即[^0-9]
    • \s       匹配空白,即空格、tab键等
    • \S      匹配非空白
    • \w      匹配单词字符,即[A-Za-z0-9_]
    • \W     匹配非单词字符,即[^A-Za-z0-9_]

    示例:

    1. # 匹配单个字符
    2. ret = re.match(".","M") # .匹配
    3. print(ret.group())
    4. ret = re.match("t.o","too")
    5. print(ret.group())
    6. ret = re.match("[hH]","hello python") # []匹配
    7. print(ret.group())
    8. ret = re.match("python\d","python3.8") # \d匹配
    9. print(ret.group())
    10. ret = re.match("python\d\.\d","python3.8")
    11. print(ret.group())
    12. ret = re.match("python\D","pythonV3.8") # \D匹配
    13. print(ret.group())
    14. ret = re.match("python\sV","python V3.8") # \s匹配
    15. print(ret.group())
    16. ret = re.match("python\SV","python-V3.8") # \S匹配
    17. print(ret.group())
    18. ret = re.match("python\wV","python_V3.8") # \w匹配
    19. print(ret.group())
    20. ret = re.match("python\WV","python-V3.8") # \W匹配
    21. print(ret.group())
    22. ret = re.search("python\WV","Hi python-V3.8") # \W匹配
    23. print(ret.group())

    3.2 匹配多个字符

    匹配多个字符时需要使用到如下修饰符:

    • *        匹配前一个字符出现0次或者无限次
    • +       匹配前一个字符出现1次或者无限次
    • ?       匹配前一个字符出现一次或者0次
    • {m}    匹配前一个字符出现m次
    • {m,n} 匹配前一个字符出现从m到n次,尽可能多的匹配

    示例:

    1. print('='*30)
    2. print("匹配多个字符")
    3. ret = re.match("Y*","YYYY-MM-DD") # *匹配0个或多个
    4. print(ret.group())
    5. ret = re.match("Y+","YYYY-MM-DD") # +匹配1个或多个
    6. print(ret.group())
    7. ret = re.match("Y?","YYYY-MM-DD") # ?匹配1个或0个
    8. print(ret.group())
    9. ret = re.match("M?","YYYY-MM-DD") # ?匹配1个或0个
    10. print(ret.group())
    11. ret = re.match("Y{3}","YYYY-MM-DD") # {m}匹配m个
    12. print(ret.group())
    13. ret = re.match("Y{3,4}","YYYY-MM-DD") # {m}匹配m个
    14. print(ret.group())
    15. ret = re.search("M?","YYYY-MM-DD") # ?匹配1个或0个
    16. print("search()匹配:",ret.group())
    17. ret = re.search("Y?","YYYY-MM-DD") # ?匹配1个或0个
    18. print("search()匹配:",ret.group())
    19. ret = re.search("M+","YYYY-MM-DD") # ?匹配1个或0个
    20. print("search()匹配:",ret.group())
    21. names = ['name','_name','2_name','__name__']
    22. reg = "[a-zA-Z_]+\w*"
    23. for name in names:
    24. ret = re.match(reg,name)
    25. if ret:
    26. print(f"变量名 {name} 符合要求")
    27. else:
    28. print(f"变量名 {name} 不符合要求")
    29. # 匹配数字
    30. reg="[1-9]+\d*$"
    31. vars = [123,32,98,"09","23","asd"]
    32. for var in vars:
    33. ret = re.match(reg,str(var))
    34. print(f"变量 {var} ",end="")
    35. if ret:
    36. print(f"符合数字要求,{ret.group()}")
    37. else:
    38. print("不符合数字要求")
    39. # 匹配0~99之间的数字
    40. reg = "[1-9]?\d"
    41. vars = ["09","0","9","90","10"]
    42. for var in vars:
    43. ret = re.match(reg,str(var))
    44. print(f"变量 {var} ",end="")
    45. if ret:
    46. print(f"符合0~99之间 {ret.group()}")
    47. else:
    48. print("符合0~99之间")
    49. # 匹配密码 密码可以是大小写字母、数字、下划线,至少8位,最多20位
    50. reg = "\w{8,20}"
    51. ret = re.match(reg,"_python3_8_0_vscode_1_pycharm")
    52. print("密码是:",ret.group())

    3.3 匹配开头结尾

    匹配开头、结尾使用如下修饰符:

    • ^        匹配字符串开头
    • $       匹配字符串结尾

    示例:

    1. # 匹配开头结尾
    2. print("="*30)
    3. print("匹配开头结尾")
    4. # 匹配中国移动号码段
    5. phones = [134,135,136,137,138,139,147,150,151,152, 157,158,159,172,178,182,183,184,187,188,198]
    6. numbers= ['12345678901','13412345678','13678349867']
    7. for num in numbers:
    8. for phone in phones:
    9. reg = "^" + str(phone) + "[0-9]{8}"
    10. ret = re.match(reg,num)
    11. if ret:
    12. print(f"{num} 是中国移动号:{ret.group()}")
    13. break
    14. if ret is None:
    15. print(f"{num} 不是中国移动号")
    16. # 匹配邮箱
    17. reg = "[\w]{4,20}@163.com$"
    18. email_lst = ["python@163.com","vscode@163.com","prcharm@189.com"]
    19. for lst in email_lst:
    20. ret = re.match(reg,lst)
    21. if ret:
    22. print(f"{lst} 是163邮箱:{ret.group()}")
    23. else:
    24. print(f"{lst} 不是163邮箱")

    显示结果:

    ==============================
    匹配开头结尾
    12345678901 不是中国移动号
    13412345678 是中国移动号:13412345678
    13678349867 是中国移动号:13678349867
    python@163.com 是163邮箱:python@163.com
    vscode@163.com 是163邮箱:vscode@163.com
    prcharm@189.com 不是163邮箱

    3.4 匹配分组

    匹配分组的修饰符如下:

    • (ab)                        将括号中字符作为一个分组
    • \num                      引用分组num匹配到的字符串
    • (?P
    • (?P=name)             引用别名为name分组匹配到的字符串

    对于返回结果是对象的函数,()匹配到的结果可以使用group(index)获取到,可以使用groups(0获取到匹配的元组的个数;

    模式中从左到右的第一个括号匹配到的内容即为group(1),以此类推;

    \number匹配的是()中的内容,从左向右第一个左括号的内容是\1,第二个左括号的内容是\2...;

    (?P

    示例:

    1. # |用法 匹配0~100之间的数字
    2. reg = "[1-9]?\d$|100"
    3. num_lst = ['12','123','09','9','0','100']
    4. for num in num_lst:
    5. ret = re.match(reg,num)
    6. if ret:
    7. print(f"{num} 是0~100之间的数字:{ret.group()}")
    8. else:
    9. print(f"{num} 不是0~100之间的数字")
    10. # ()匹配
    11. # 提取区号和电话号
    12. reg = "([^-]*)-(\d+)"
    13. phones = ['0730-123456','0700-23456','asd-23456']
    14. for phone in phones:
    15. ret = re.match(reg,phone)
    16. if ret:
    17. print(f"{phone}是正确的电话号码,区号是{ret.group(1)},电话号是{ret.group(2)}")
    18. else:
    19. print(f"{phone}不是正确的电话号码")
    20. # 使用如下的模式不能识别正确的HTML标签
    21. reg = "<[a-zA-Z]*>\w*"
    22. html_lst = ["python","python"]
    23. for lst in html_lst:
    24. ret = re.match(reg,lst)
    25. if ret:
    26. print(f"{lst} 是正常的HTML标签:{ret.group()}")
    27. else:
    28. print(f"{lst} 不是正常的HTML标签")
    29. # \用法
    30. print("="*30)
    31. print("\\用法")
    32. reg = r"<([a-zA-Z]*)>\w*"
    33. html_lst = ["python","python"]
    34. for lst in html_lst:
    35. ret = re.match(reg,lst)
    36. if ret:
    37. print(f"{lst} 是正常的HTML标签:{ret.group()}")
    38. else:
    39. print(f"{lst} 不是正常的HTML标签")
    40. # \number用法
    41. print("="*30)
    42. print("\\number用法")
    43. reg = r"<(\w*)><(\w*)>.*"
    44. html_lst = ["python",
    45. "python",
    46. "

      python

      "
      ,
    47. "

      python

      "
    48. ]
    49. for lst in html_lst:
    50. ret = re.match(reg,lst)
    51. if ret:
    52. print(f"{lst} 是正常的HTML标签:{ret.group()}")
    53. else:
    54. print(f"{lst} 不是正常的HTML标签")
    55. # (?P)和(?P=name)匹配
    56. print("="*30)
    57. print("(?P)和(?P=name)匹配")
    58. reg = r"<(?P\w*)><(?P\w*)>.*"
    59. html_lst = ["python",
    60. "python",
    61. "

      python

      "
      ,
    62. "

      python

      "
      ,
    63. "

      csdn.com

      "
      ,
    64. "

      csdn.com

      "
      ,
    65. "

      www.itcast.cn

      "
    66. "

      www.itcast.cn

      "
    67. ]
    68. for lst in html_lst:
    69. ret = re.match(reg,lst)
    70. if ret:
    71. print(f"{lst} 是正常的HTML标签:{ret.group()}")
    72. else:
    73. print(f"{lst} 不是正常的HTML标签")

    4. 特殊语法

    4.1  特殊语法1:(?:pattern)

    前面介绍过()是分组,()匹配的内容会被保存起来;从左到右,以分组的左括号位标志,第一个出现的分组的组号为1,第二个为2,以此类推。

    (?:)表示不捕获分组,意味着匹配的内容不会被保存起来。

    对比如下代码,可以看到(?:pattern)不获取匹配结果

    1. # (?:pattern) 不捕获分组
    2. s = "123asd456"
    3. reg = r"(\d*)([a-z]*)(\d*)"
    4. ret = re.search(reg,s)
    5. if ret:
    6. print(f"MATCH: {ret.groups()}")
    7. else:
    8. print("NOT MATCH!!!")
    9. reg = r"(?:\d*)([a-z]*)(\d*)"
    10. ret = re.search(reg,s)
    11. if ret:
    12. print(f"MATCH: {ret.groups()}")
    13. else:
    14. print("NOT MATCH!!!")

    显示结果

    MATCH: ('123', 'asd', '456')
    MATCH: ('asd', '456')

    4.2  特殊语法2:(?=pattern)

    该语法是正向肯定预查,匹配pattern前面的位置,这是一个非获取匹配,即该匹配不需要获取供以后使用。

    1. # (?=pattern) 模式匹配
    2. s=['windows7','windows10','windows11','windows2000','windows2010']
    3. reg = r"windows(?=95|7|10|11|xp)"
    4. for lst in s:
    5. ret = re.search(reg,lst)
    6. if ret:
    7. print(f"MATCH: {ret.group()}")
    8. else:
    9. print("NOT MATCH!!!")

    显示结果:

    MATCH: windows
    MATCH: windows
    MATCH: windows
    NOT MATCH!!!
    NOT MATCH!!!

    ※※※ (?:pattern)和(?=pattern)的区别

    • (?:pattern)匹配得到的结果包含pattern,(?=pattern)匹配得到的结果不包含pattern;
    • (?:pattern)消耗字符,下一个字符匹配从已匹配后的位置开始;(?=pattern)不消耗字符,下一个字符匹配从预查之前的位置开始

    4.3  特殊语法3:(?!pattern)

    改语法是正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,这是一个非获取匹配,该匹配不需要获取供以后使用。

    示例:

    1. s=['windows7','windows10','windows11','windows2000','windows2010']
    2. reg = r"windows(?!95|7|10|11|xp)"
    3. print(f"pattern:{reg}")
    4. for lst in s:
    5. ret = re.search(reg,lst)
    6. if ret:
    7. print(f"{lst} MATCH: {ret.group()}")
    8. else:
    9. print("NOT MATCH!!!")

    显示结果:

    pattern:windows(?!95|7|10|11|xp)
    NOT MATCH!!!
    NOT MATCH!!!
    NOT MATCH!!!
    windows2000 MATCH: windows
    windows2010 MATCH: windows

    5. 正则表达式中的贪婪和非贪婪

    从名字就可以看出,贪婪表示更多,那非贪婪就与贪婪相反,表示更少。

    贪婪模式下正则表达式匹配时,在从左到右的顺序求值时,会尽可能的获取满足匹配的最长字符。非贪婪则尝试匹配尽可能少的字符。

    python中数量词默认是贪婪的,会尝试匹配尽可能多的字符;在 *,?,+,{m,n}后面加上?会使贪婪变成非贪婪。

    如下示例:

    1. s = "blog.csdn.net"
    2. reg = "\w+"
    3. ret = re.match(reg,s)
    4. if ret:
    5. print(f"{reg} MATCH {s}: {ret.group()}")
    6. else:
    7. print("NOT MATCH!!!")
    8. reg = "\w+?"
    9. ret = re.match(reg,s)
    10. if ret:
    11. print(f"{reg} MATCH {s}: {ret.group()}")
    12. else:
    13. print("NOT MATCH!!!")
    14. reg = "\w{2,5}"
    15. ret = re.match(reg,s)
    16. if ret:
    17. print(f"{reg} MATCH {s}: {ret.group()}")
    18. else:
    19. print("NOT MATCH!!!")
    20. reg = "\w{2,5}?"
    21. ret = re.match(reg,s)
    22. if ret:
    23. print(f"{reg} MATCH {s}: {ret.group()}")
    24. else:
    25. print("NOT MATCH!!!")

     显示结果:

    \w+ MATCH blog.csdn.net: blog
    \w+? MATCH blog.csdn.net: b
    \w{2,5} MATCH blog.csdn.net: blog
    \w{2,5}? MATCH blog.csdn.net: bl

    6.  python中 r 的作用

    python中使用r表示模式中是原生字符串,如果不使用r,有的字符需要进行转义才能表达想要的模式。

    如要匹配 “\\",如果使用r,那么模式可以为 r"\\";如果不使用r,那么模式是 "\\\\",第一个和第三个\表示转义字符。

    全文参考链接:100天精通Python(进阶篇)——第34天:正则表达式大总结_无 羡ღ的博客-CSDN博客https://blog.csdn.net/yuan2019035055/article/details/124217883?app_version=5.7.0&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22124217883%22%2C%22source%22%3A%22yuan2019035055%22%7D&ctrtid=dmICC&utm_source=app

  • 相关阅读:
    [PHP] - 编译参数 --enable-sysvsem
    基于GAN的自动提取混凝土损伤特征方法
    golang冒泡排序代码实现
    KubeSphere Namespace 数据删除事故分析与解决全记录
    关于 Java Lambda 表达式看这一篇就够了(强烈建议收藏)
    大模型应用发展的方向|代理 Agent 的兴起及其未来(上)
    C++--第一个代码hello world
    【Java 进阶篇】Java XML组成部分:理解XML的结构
    jQuery用DOM遍历实现商城结算系统
    荧光染料BDP FL DBCO,BDP FL 二苯基环辛炔,CAS:2360493-46-3
  • 原文地址:https://blog.csdn.net/sinat_41752325/article/details/126098045