正则表达式匹配括号内的内容
在处理文本内容的时候,经常需要从括号中提取出其中的内容。例如,从一个文件路径中提取出文件名,从一段HTML代码中提取出其中的标签等等。这些情况都可以通过正则表达式实现。
括号的种类及其含义
在正则表达式中,有多种括号用来表示不同的含义,如下所示:
- 普通圆括号 “()”: 表示一个捕获组(capturing group),里面的内容可以被后面的正则表达式引用。
- 方括号 “[]”: 表示字符集(character set),里面的字符可以匹配其中任意一个字符。
- 大括号 “{}”: 表示数量限定符(quantifier),里面的数字可以指定匹配次数的范围。
- 尖括号 “<>”: 一般不用于正则表达式,与HTML标签有关。
其中,我们最常用的是普通圆括号。
普通圆括号的使用
假设我们有一个字符串,其中包含了一些文件路径,我们希望从中提取出文件名。可以用如下的正则表达式来实现:
import re
path = "/Users/username/Desktop/test.txt"
filename = re.search(r'/([^/]+\.[^/]+)$', path)
print(filename.group(1)) # 输出"test.txt"
上述代码中,我们使用了普通圆括号来创建一个捕获组,其中包含了后缀名不为”/”的所有字符。具体解释如下:
- “/” 匹配斜杠字符
- “()” 表示一个捕获组,包含后面的正则表达式中的内容
- “[^/]+” 表示匹配一次或多次非斜杠字符
- “.” 匹配点字符
- “[^/]+” 表示匹配一次或多次非斜杠字符
- “$” 匹配字符串末尾
因此,正则表达式 “/([^/]+.[^/]+)$” 将匹配 “/test.txt”。在正则表达式中,圆括号内的内容可以通过 group(n) 方法来引用,其中 n 表示组的索引。由于我们只有一个捕获组,即索引为 1 的组,因此使用 group(1) 可以获取到文件名 “test.txt”。
环视
在某些情况下,我们需要匹配的内容并不是一个固定的字符串,而是与前面或后面的字符串进行匹配。在这种情况下,可以使用环视(lookaround)来实现。
环视包括正向前瞻(positive lookahead)、负向前瞻(negative lookahead)、正向后顾(positive lookbehind)以及负向后顾(negative lookbehind)四种,它们的具体语法如下:
- 正向前瞻: (?=pattern)
- 负向前瞻: (?!pattern)
- 正向后顾: (?<=pattern)
- 负向后顾: (?<!pattern)
例如,假设我们有一个HTML代码段,其中包含了多个超链接,我们希望获取其中的所有链接地址。链接地址的特点是以 “http://” 或 “https://” 开头,以 ” ” 或 “>” 结尾。可以用如下的正则表达式来实现:
import re
html = '<a href="http://www.example.com">example</a> '
html += '<a href="https://www.google.com">google</a> '
html += '<a href="ftp://ftp.example.com">ftp</a>'
links = re.findall(r'(?<=href=")(https?://[^" >]*)', html)
print(links) # 输出:['http://www.example.com', 'https://www.google.com']
上述代码中,我们使用了正向后顾来匹配 “href=”,并且使用了捕获组来获取链接地址。具体解释如下:
(?<=href=\")
表示匹配 “href=” 前面的字符串,但不包括 “href=”(https?://[^" >]*)
表示匹配以 “http://” 或 “https://” 开头,以 ” ” 或>
结尾的字符串,并使用捕获组来获取其中的内容
由于我们使用了捕获组,因此使用 findall() 方法可以一次匹配所有的链接地址,并返回一个列表。
结论
正则表达式是一种强大的文本处理工具,可以用来匹配和提取文本中的各种数据。利用好正则表达式,可以大大提高程序的效率。在处理括号内的内容时,我们可以使用普通圆括号来创建捕获组,从而获取其中的内容。同时,在某些情况下,我们也可以使用环视来匹配与前后文相关的内容。