2.2 正则表达式 - 定位符的使用

文摘   2024-07-31 22:59   云南  

【目录】


  • 1.正则表达式中的定位符概念

  • 2.常见的定位符

  • 3.^定位符:匹配字符串开始位置

  • 4.$定位符:匹配字符串结尾

  • 5.\b定位符:匹配单词边界

  • 6.\b \B的区别

  • 7.总结

小伙伴可加微信xyz77520520 避免失联。

有学习笔记要求(例:帮我写一篇XXX知识的笔记),微信联系。

【正文】

学习时间30分钟。

1.正则表达式中的定位符概念

正则表达式中的定位符是指一类具有特定功能的符号。
作用:描述字符的边界。例如字符串的开始、结束单词的边界
在正则表达式中,定位符帮助用户确定模式匹配的具体位置,从而提高匹配的准确性和效率。
例如,在编程和文本处理中,常常需要精确地找到字符串的开始、结束或单词的确切边界。

2.常见的定位符

定位符代码作用说明举例说明
^匹配字符串的开始位置^abc 匹配以 "abc" 开头的字符串
$匹配字符串的结束位置xyz$ 匹配以 "xyz" 结尾的字符串
\b匹配单词边界,单词的边界符通常是空格、标点符号或者换行\bword\b 匹配独立的单词 "word",而不是包含在其他单词中的部分
\B匹配非单词边界\Bing\B 匹配包含 "ing" 但不作为独立单词的部分

3.^定位符:匹配字符串开始位置

  1. 用途

  • 用于匹配目标字符串的开始位置。
    即从字符串的起始处开始匹配,适用于必须位于字符串开头的特定单词、数字或字符序列的搜索。
    要匹配的对象可以是1个字符,也可以是多个字符。
  • 语法和用法

    • 语法:在正则表达式的前面放置^符号。
    • 用法:当^作为定位符使用时,它应该出现在正则表达式的最开始位置。
      例如,^abc会匹配任何以"abc"开始的字符串。
  • 举例说明

    • 示例1:假设有字符串 "abcdef",使用正则表达式 ^abc 可以匹配该字符串,因为 "abc" 是从头开始的。
    • 示例2:对于字符串 "xyzabc",使用同样的正则表达式 ^abc 则不会匹配,因为 "abc" 不是从字符串的开始位置出现。
  • 常见用例

    • 数据验证:检查字符串是否以特定格式开始,如电子邮件地址是否以 "from:" 开始。
    • 日志分析:在日志文件中查找以特定时间戳或错误代码开头的记录。
  • 与其他定位符的组合使用

    • $组合^$ 一起使用时,可以匹配整个字符串,如 ^abc$ 将精确匹配只包含 "abc" 的字符串。
    • \b组合^ 可以与 \b 结合使用来匹配位于字符串开始且为完整单词的模式。
  • 代码示例

  • # 导入Python的正则表达式模块
    import re

    # 定义一个包含多个字符串的列表
    strings = ['Monday''Tuesday''Wednesday''Thursday''Friday''Saturday''Sunday']

    # ^S是正则表达式,作用是匹配任何以字母'S'开头的字符串
    # r表示这是一个原始字符串,原始字符串不会对反斜杠进行转义处理,而是将其视为普通字符
    # `^`表示字符串的开始
    # `S`表示字母'S'
    pattern = r'^S'

    # 遍历列表中的每个字符串
    for string in strings:
        # match 方法从字符串的开头开始匹配正则表达式
        # 如果匹配,返回一个匹配对象;如果不匹配,返回None
        if re.match(pattern, string):
            # 如果字符串匹配,打印一条消息说明该字符串匹配
            print(f"{string} 符合")
        else:
            print(f"{string} 不符合")

    【终端输出】

    Monday 不符合
    Tuesday 不符合
    Wednesday 不符合
    Thursday 不符合
    Friday 不符合
    Saturday 符合
    Sunday 符合
    1. 正则表达式语法解析
    pattern = r'^S'
    • r表示这是一个原始字符串,原始字符串不会对反斜杠进行转义处理,而是将其视为普通字符。
    • r后接引号 ''
    • ^是正则表达式的第1个字符,表示字符串的开始。
    • S正则表达式的第2个字符,表示要匹配以字母S开头的字符串。

    4.$定位符:匹配字符串结尾

    1. 用途

    • 用途:用于匹配目标字符串的结束位置。确保匹配项必须出现在字符串的末尾。
      要匹配的对象可以是1个字符,也可以是多个字符。
  • 语法和用法

    • 语法:在要匹配的字符串后面放置$符号。
    • 用法:定位符$必须出现在字符串的末尾。
      例如,正则表达式 abc$ 会匹配任何以 "abc" 结尾的字符串,如 "testabc"。
      在多行模式下,$ 可以匹配每个行的结束,而不仅仅是整个字符串的结束。
  • 示例说明

    • 比如有字符串 "xyzabc",使用正则表达式 abc$ 进行匹配,由于 "abc" 位于字符串末尾,因此会成功匹配。
    • 对于字符串 "xyzabcmid",使用同一正则表达式 abc$ 进行匹配,则会匹配失败,因为 "abc" 不是字符串的末尾部分。
  • 注意事项

    • $定位符只关注字符串的结束位置,不关心开始位置,若要确保整个字符串与模式完全匹配,可使用 ^$ 组合,如 ^abc$
    • 在处理多行文本时,每个行的结尾都会被视为一个结束位置,这在处理日志文件等多行数据时非常有用。
  • 应用场景

    • 验证数据:检查字符串是否以特定模式结束,如检查URL是否以特定后缀结束。
    • 日志分析:在多行日志中查找以特定模式结束的条目。
  • 代码示例

  • # 导入正则表达式模块
    import re 

    # 定义一个包含三个邮箱地址的列表
    email_list = ["example1@163.com""example2@gmail.com""example3@163.comJ"]  

    # @163.com\$是正则表达式,用于匹配以"@163.com"结尾的字符串
    # r表示这是一个原始字符串,原始字符串不会对反斜杠进行转义处理,而是将其视为普通字符
    # `@163.com`表示要匹配的字符串
    # `\$`表示字符串的结束
    pattern = r"@163.com\$" 

    # 遍历email_list中的每个邮箱地址
    for email in email_list:
        # 使用re.search()函数检查当前邮箱地址是否与pattern匹配
        # search 方法则会搜索整个字符串,查找任何位置的匹配项
        if re.search(pattern, email):
            # 如果匹配成功,打印匹配成功的信息
            print(f"{email} 匹配成功")  
        else:
            # 如果匹配失败,打印匹配失败的信息
            print(f"{email} 匹配失败")  

    【终端输出】

    example1@163.com 匹配失败
    example2@gmail.com 匹配失败
    example3@163.comJ 匹配失败
    1. 正则表达式语法解析
    pattern = r"@163.com\$" 
    • r表示这是一个原始字符串,原始字符串不会对反斜杠进行转义处理,而是将其视为普通字符。
    • r后接引号 ''
    • @163.com表示要匹配的对象。
    • \$是表示字符串的结束,即匹配以@163.com结束的字符串。

    5.\b定位符:匹配单词边界

    1. 单词边界:单词的边界是指字符在字符串中的位置,它决定了字符是否可以被识别为一个独立的单词或符号。在计算机编程中,字符边界通常由空格、标点符号其他非字母数字字符来定义。

    • 例如,假设我们有一个字符串 "hello world",在这个字符串中,"hello" 和 "world" 之间有一个空格,这个空格就是一个字符边界。当我们使用正则表达式进行匹配时,我们可以利用字符边界来精确地找到我们想要的单词或符号。
  • 用途

    • \b 用于匹配单词边界。它确保所匹配的模式出现在单词的开头或结尾,而不是单词中间。
    • \b 主要用于精确匹配单词,避免误匹配。
    • 它可以帮助我们在文本中查找独立的单词,而不会匹配到包含该单词的其他单词。
  • 语法和用法

    • \b 是一个特殊字符序列,不需要转义。
    • \B\b 的反义词,用于匹配非单词边界。
  • 示例说明

    • 假设我们有字符串 "Hello, world!",如果我们使用正则表达式 \bworld\b 进行匹配,它将只匹配到 "world" 这个单词本身,而不是其他包含 "world" 的字符串的一部分。
  • 注意事项

    • \b 对于某些语言(如中文)可能不适用,因为在这些语言中没有明确的单词边界概念。在这种情况下,可能需要使用其他方法来匹配特定单词。
    • 在使用 \b 时,需要注意其前后是否有其他字符,以避免不必要的匹配。例如,\bcat\b 只会匹配独立的单词 "cat",而不会匹配 "concatenate" 中的 "cat"。
  • 应用场景

    • 在搜索引擎中,可以使用 \b 来精确匹配搜索关键词,提高搜索结果的准确性。
    • 在文本编辑器或文本处理工具中,可以使用 \b 进行单词级别的操作,如查找、替换等。
    • 在编程语言中,可以使用 \b 来进行词法分析,识别出代码中的关键字、变量名等。
  • 代码示例

  • # 导入正则表达式模块
    import re  

    # 定义要搜索的文本字符串
    text = "Hello, world!"  
    # \bworld\b是一个正则表达式,用于匹配单词"world",其中\b表示单词边界
    pattern = r'\bworld\b'  

    # 使用re.findall函数查找所有匹配的模式
    matches = re.findall(pattern, text) 

    # 输出找到的匹配项,即['world']
    print(matches)  

    【终端输出】

    ['world']
    1. 正则表达式语法解析
    pattern = r'\bworld\b' 
    • r表示这是一个原始字符串,原始字符串不会对反斜杠进行转义处理,而是将其视为普通字符。
    • r后接引号 ''
    • \b:表示单词边界。它匹配位于单词字符和非单词字符之间的边界。
    • world:是要匹配的单词本身。在这种情况下,我们想要匹配整个单词 "world"。
    • \b:再次出现,表示另一个单词边界。这确保了 "world" 前后都是单词边界,即 "world" 是一个完整的单词。

    6.\b \B的区别

    【举例说明】

    • \d:是一个预定义的字符类,表示任何数字字符(0-9)

    • \b\d 匹配字符串的"2th year5 4day w3c"中的2和42和4前面有空格,即字符边界。

    • \d\b 匹配字符串的"2th year5 4day w3c"中的55后面有空格,即字符边界。

    • \B\d 匹配字符串的"2th year5 4day w3c"中的33在中间,即非字符边界。。

    • \b\d 表式匹配字符串的首字符为数字。

    • \d\b 表式匹配字符串的尾字符为数字。

    • \B\d 表式匹配字符串中间的数字。

    【\b\d代码示例】

    # 导入正则表达式模块
    import re  

    # 定义要搜索的文本字符串
    text = "2th year5 4day w3c"  
    # \b\d是一个正则表达式,用于匹配字符串的首字符为数字字符,其中\b表示单词边界
    pattern = r'\b\d'  

    # 使用re.findall函数查找所有匹配的模式
    matches = re.findall(pattern, text) 

    # 输出找到的匹配项
    print(matches)  

    【终端输出】

    ['2', '4']

    【\d\b代码示例】

    # 导入正则表达式模块
    import re  

    # 定义要搜索的文本字符串
    text = "2th year5 4day w3c"  
    # \d\b是一个正则表达式,用于匹配字符串的尾字符为数字字符,其中\b表示单词边界
    pattern = r'\d\b'  

    # 使用re.findall函数查找所有匹配的模式
    matches = re.findall(pattern, text) 

    # 输出找到的匹配项,
    print(matches)  

    【终端输出】

    ['5']

    【\B\d代码示例】

    # 导入正则表达式模块
    import re  

    # 定义要搜索的文本字符串
    text = "2th year 4day w3c"  
    # \B\d是一个正则表达式,表式匹配字符串中间的数字,其中\B表示非单词边界
    pattern = r'\B\d'  

    # 使用re.findall函数查找所有匹配的模式
    matches = re.findall(pattern, text) 

    # 输出找到的匹配项,
    print(matches)  

    【终端输出】

    ['3']

    7.总结


    安迪python学习笔记
    python学习笔记,适合初学者。
     最新文章