【目录】
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个字符,也可以是多个字符。
语法和用法
语法:在正则表达式的前面放置 ^
符号。用法:当 ^
作为定位符使用时,它应该出现在正则表达式的最开始位置。
例如,^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 符合
正则表达式语法解析
pattern = r'^S'
r
表示这是一个原始字符串,原始字符串不会对反斜杠进行转义处理,而是将其视为普通字符。r后接引号 ''
。^
是正则表达式的第1个字符,表示字符串的开始。S
正则表达式的第2个字符,表示要匹配以字母S
开头的字符串。
4.$定位符:匹配字符串结尾
用途
用途:用于匹配目标字符串的 结束
位置。确保匹配项必须出现在字符串的末尾。
要匹配的对象可以是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 匹配失败
正则表达式语法解析
pattern = r"@163.com\$"
r
表示这是一个原始字符串,原始字符串不会对反斜杠进行转义处理,而是将其视为普通字符。r后接引号 ''
。@163.com
表示要匹配的对象。\$
是表示字符串的结束,即匹配以@163.com
结束的字符串。
5.\b定位符:匹配单词边界
单词边界:单词的边界是指字符在字符串中的位置,它决定了字符是否可以被识别为一个独立的单词或符号。在计算机编程中,字符边界通常由
空格、标点符号
或其他非字母数字字符
来定义。
例如,假设我们有一个字符串 "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']
正则表达式语法解析
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和4
,2和4
前面有空格,即字符边界。\d\b
匹配字符串的"2th year5 4day w3c"中的5
,5
后面有空格,即字符边界。\B\d
匹配字符串的"2th year5 4day w3c"中的3
,3
在中间,即非字符边界。。\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']