正则表达式是什么?它是一种强大的文本处理工具,就如同一位神奇的文字魔法师,能在海量的文本信息中迅速精准地找到你想要的内容。在技术面试中,正则表达式相关的题目更是高频出现,掌握它的使用方法,无疑是拿到心仪 offer 的一把关键钥匙。下面就为大家带来一份完整的正则表达式使用方法及高频面试题指南。 正则表达式基础概念 正则表达式,简单来说,就是用特定字符和规则组成的模式,用来描述字符串的特征。它可以匹配、查找、替换符合该模式的字符串。比如,你要在一篇文章里找出所有的电话号码,用正则表达式就能轻松搞定。 正则表达式由普通字符和元字符组成。普通字符就是我们日常使用的字母、数字、标点等,而元字符则具有特殊的含义。 常见的元字符有:
“.”:匹配除换行符以外的任意单个字符。比如正则表达式 “a.c” 可以匹配 “abc”、“adc” 等。 “”:匹配前面的子表达式零次或多次。例如 “ab” 可以匹配 “a”、“ab”、“abb” 等。 “+”:匹配前面的子表达式一次或多次。像 “ab+” 能匹配 “ab”、“abb” ,但不能匹配 “a”。 “?”:匹配前面的子表达式零次或一次。比如 “ab?” 可以匹配 “a” 或 “ab”。
正则表达式使用方法 在不同的编程语言中,正则表达式的使用方式略有不同,但基本原理是一样的。下面以 Python 为例,介绍正则表达式的使用步骤。
- 导入 re 模块:Python 中内置了 re 模块用于处理正则表达式。 示例代码:
import re
- 定义正则表达式模式:使用字符串来定义你需要的正则表达式。 例如,要匹配一个由数字组成的字符串:
pattern = r'\d+'
这里的 “r” 表示原始字符串,避免转义字符带来的问题。“\d” 是元字符,代表任意数字,“+” 表示匹配一次或多次。 3. 编译正则表达式:使用 re.compile() 函数将正则表达式模式编译成一个正则表达式对象。 示例代码:
regex = re.compile(pattern)
- 进行匹配操作:使用编译好的正则表达式对象进行匹配。常见的匹配方法有 match()、search()、findall() 等。
- match():从字符串的起始位置开始匹配,如果起始位置匹配成功则返回匹配对象,否则返回 None。 示例代码:
text = "123abc" result = regex.match(text) if result: print(result.group())
- search():在整个字符串中查找第一个匹配的子串,如果找到则返回匹配对象,否则返回 None。 示例代码:
text = "abc123def" result = regex.search(text) if result: print(result.group())
- findall():在整个字符串中查找所有匹配的子串,并以列表形式返回。 示例代码:
text = "abc123def456" result = regex.findall(text) print(result)
正则表达式高级应用 除了基本的匹配操作,正则表达式还有很多高级应用,如分组、回溯引用、前瞻后顾等。
- 分组:使用圆括号 “()” 可以将正则表达式的一部分括起来,形成一个分组。分组可以用于提取匹配的子串,也可以用于回溯引用。 例如,要匹配一个日期格式 “YYYY-MM-DD”,并提取出年、月、日:
import re pattern = r'(\d{4})-(\d{2})-(\d{2})' text = "2024-05-10" regex = re.compile(pattern) result = regex.match(text) if result: year = result.group(1) month = result.group(2) day = result.group(3) print(f"年: {year}, 月: {month}, 日: {day}")
- 回溯引用:通过 “\数字” 的形式引用前面分组匹配到的内容。 例如,要匹配重复的单词:
import re pattern = r'\b(\w+)\b\s+\b\1\b' text = "hello hello world" regex = re.compile(pattern) result = regex.search(text) if result: print(result.group())
- 前瞻后顾:用于在匹配时对前后的内容进行判断,但不包含在匹配结果中。
- 正向前瞻:使用 “(?=...)” 表示后面必须跟着指定的内容。
- 负向前瞻:使用 “(?!...)” 表示后面不能跟着指定的内容。
- 正向后顾:使用 “(?
- 负向后顾:使用 “(? 例如,要匹配以 “http://” 开头的 URL:
import re pattern = r'(?<=http://)[\w.-]+' text = "www.ysdslt.com" regex = re.compile(pattern) result = regex.search(text) if result: print(result.group())
正则表达式高频面试题
- 如何匹配一个邮箱地址? 邮箱地址的一般格式为 “用户名@域名”。可以使用以下正则表达式:
import re pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$' email = "test@" regex = re.compile(pattern) result = regex.match(email) if result: print("邮箱地址合法") else: print("邮箱地址不合法")
- 如何匹配一个手机号码? 手机号码一般是 11 位数字,以 1 开头。正则表达式可以这样写:
import re pattern = r'^1[3-9]\d{9}$' phone = "13800138000" regex = re.compile(pattern) result = regex.match(phone) if result: print("手机号码合法") else: print("手机号码不合法")
- 如何使用正则表达式去除字符串中的 HTML 标签? 可以使用正则表达式匹配 HTML 标签并替换为空字符串。
import re html = "这是一段 带 HTML 标签 的文本。" pattern = r']+>' regex = re.compile(pattern) text = regex.sub('', html) print(text)
正则表达式的世界丰富多彩,掌握它的使用方法,不仅能在面试中脱颖而出,还能在日常的文本处理工作中如鱼得水。希望这份指南能帮助大家更好地理解和运用正则表达式。