Python 中导入正则表达式库(import re)及使用
正则表达式
正则表达式(Regular Expression,简称 regex 或 regexp)是一种文本模式描述的方法,用于字符串的搜索、替换、验证等操作。它们定义了一种搜索算法,可以根据指定的模式匹配文本中的字符串。正则表达式通常用于文本编辑器、编程语言和搜索引擎中,以实现强大的文本处理功能。
正则表达式由一系列的字符和特殊符号组成,这些字符和符号组合起来描述了一个搜索模式。这些特殊符号被称为“元字符”,它们赋予了正则表达式强大的匹配能力。例如,.
可以匹配除换行符之外的任何单个字符,*
表示匹配前面的子表达式零次或多次,+
表示匹配前面的子表达式一次或多次,?
表示匹配前面的子表达式零次或一次,等等。
正则表达式的基本组成部分包括:
-
普通字符:大多数字符,包括所有的大写和小写字母、所有的数字、标点符号和一些其他符号,都是普通字符。它们在正则表达式中只匹配自己。
-
特殊字符(也称为“元字符”):这些字符在正则表达式中有特殊的含义,用于指定搜索的模式。例如,^表示匹配输入字符串的开始位置,
$
表示匹配输入字符串的结束位置,.
表示匹配除换行符之外的任何单个字符,等等。 -
字符类:字符类允许你指定一组字符中的任何一个字符。例如,
[abc]
表示匹配a
、b
或c
中的任何一个字符,[0-9]
表示匹配任何单个数字。 -
量词:量词用于指定前面的字符或字符类出现的次数。例如,
*
表示前面的子表达式可以出现零次或多次,+
表示前面的子表达式可以出现一次或多次,?
表示前面的子表达式可以出现零次或一次,{n}
表示前面的子表达式恰好出现n
次,{n,}
表示前面的子表达式至少出现n
次,{n,m}
表示前面的子表达式至少出现n
次,但不超过m
次。 -
分组和引用:使用圆括号
()
可以将正则表达式的一部分组合成一个子表达式(也称为分组)。分组可以作为一个整体被量词修饰,也可以被引用(通过\n
的形式,其中n
是分组的编号)。 -
边界匹配符:用于指定字符串的边界。例如,
^
表示字符串的开始,$
表示字符串的结束,\b
表示单词边界。 -
选择符:使用
|
可以指定多个可能的匹配模式,实现“或”的逻辑。
正则表达式是一种非常强大的工具,但由于其语法相对复杂,初学者可能会感到有些困难。
#re库及使用
import re
是 Python 中用于导入正则表达式(Regular Expression)库的语句。正则表达式是一种强大的文本处理工具,它使用一种特定的语法模式来描述在搜索文本时要匹配的一个或多个字符串。Python 的 re
模块提供了对正则表达式的支持,使得在 Python 程序中可以很方便地进行字符串的搜索、替换、匹配验证等操作。
1. 搜索(Search)
import re
# 搜索字符串中的第一个数字
pattern = r'\d+'
text = "我的电话号码是123-456-7890,请联系我。"
match = re.search(pattern, text)
if match:
print("找到数字:", match.group())
else:
print("未找到数字")
2. 匹配(Match)
import re
# 检查字符串是否以数字开头
pattern = r'^\d+'
text = "123这是一个数字开头的字符串"
match = re.match(pattern, text)
if match:
print("字符串以数字开头")
else:
print("字符串不以数字开头")
3. 查找所有(Find All)
import re
# 查找字符串中所有的单词
pattern = r'\b\w+\b'
text = "Hello, this is a test string with some words."
matches = re.findall(pattern, text)
print("找到的单词:", matches)
4. 替换(Substitute)
import re
# 将字符串中的所有数字替换为星号
pattern = r'\d+'
text = "我的电话号码是123-456-7890,请联系我。"
replaced_text = re.sub(pattern, '*', text)
print("替换后的字符串:", replaced_text)
5. 分割(Split)
import re
# 使用逗号加空格作为分隔符分割字符串
pattern = r',\s*'
text = "苹果, 香蕉, 橙子, 葡萄"
items = re.split(pattern, text)
print("分割后的列表:", items)
6. 编译(Compile)
import re
# 编译正则表达式以提高效率
pattern = re.compile(r'\b\w+\b')
text = "Hello, this is a test string with some words."
#编译后使用
matches = pattern.findall(text)
print("找到的单词:", matches)
# 还可以使用其他方法,如 search, match, sub, split 等
match = pattern.search(text)
if match:
print("第一个单词:", match.group())
这些例子展示了 re
模块的一些基本用法。通过编译正则表达式,你可以重复使用相同的模式进行多次匹配,从而提高效率。正则表达式是处理文本的强大工具,它们可以应用于各种场景,如数据清洗、日志分析、文本验证等。
#正则表达式的更复杂特性和技巧
re
模块的高级用法涉及到正则表达式的更复杂特性和技巧。以下是一些高级用法的示例:
1. 贪婪与非贪婪匹配
正则表达式中的量词(如 *
, +
, ?
)默认是贪婪的,即它们会尽可能多地匹配字符。但可以通过在量词后面添加 ?
来使其变为非贪婪的,即尽可能少地匹配字符。
import re
# 贪婪匹配
greedy_match = re.findall(r'a.*b', 'aabab')
print("贪婪匹配:", greedy_match) # 输出: ['aabab']
# 非贪婪匹配
non_greedy_match = re.findall(r'a.*?b', 'aabab')
print("非贪婪匹配:", non_greedy_match) # 输出: ['aab', 'ab']
2. 捕获组(Capturing Groups)
捕获组允许你将正则表达式的一部分匹配结果保存起来,以便后续引用或处理。捕获组是通过圆括号 ()
来定义的。
import re
# 使用捕获组提取URL中的协议和域名
url = "https://www.example.com/path/to/page"
match = re.search(r'(https?://)([a-zA-Z0-9.]+)', url)
if match:
protocol = match.group(1)
domain = match.group(2)
print("协议:", protocol) # 输出: 协议: https://
print("域名:", domain) # 输出: 域名: www.example.com
3. 正向前瞻(Positive Lookahead)和正向后瞻(Positive Lookbehind)
正向前瞻用于匹配某个位置,要求该位置后面的字符序列符合某个模式,但匹配结果中不包括这部分字符序列。
import re
# 使用正向前瞻来匹配不以's'结尾的单词
text = "cars and trucks and classes"
matches = re.findall(r'\b\w+(?!'s\b)', text)
print("正向前瞻示例(不以's'结尾的单词):", matches) # 输出: ['cars', 'and', 'trucks', 'and', 'classes']
# 注意:'classes' 实际上被错误地包含了,因为它虽然不以's'单独结尾,但整个单词包含's'。
# 为了更精确地匹配,我们可能需要更复杂的逻辑或更具体的上下文。
# 更精确的例子:匹配完全由小写字母组成且不以's'结尾的单词
matches_precise = re.findall(r'\b[a-z]+(?!'s\b)', "cars and trucks plus classes")
print("更精确的正向前瞻示例:", matches_precise) # 输出: ['cars', 'and', 'trucks', 'plus']
正向后瞻用于匹配某个位置,要求该位置前面的字符序列符合某个模式,但匹配结果中不包括这部分字符序列。
import re
# 使用正向后瞻来匹配紧跟在数字后面的单词
text = "The price is 100 dollars and 200 euros."
matches = re.findall(r'(?<=\d\s)\w+', text)
print("正向后瞻示例(紧跟在数字后面的单词):", matches) # 输出: ['dollars', 'euros']
# 注意:\d\s 表示一个数字后面紧跟着一个空白字符(空格、制表符等)
# \w+ 则匹配这个空白字符后面的单词字符序列
4. 编译标志(Compilation Flags)
re
模块提供了一些编译标志,用于改变正则表达式的匹配方式。这些标志可以通过按位或运算符(|
)组合使用。
import re
# 忽略大小写的匹配
text = "Hello, World!"
match = re.search(r'hello', text, re.IGNORECASE)
if match:
print("找到匹配项:", match.group()) # 输出: 找到匹配项: Hello
# 多行匹配,使^和$分别匹配每一行的开始和结束
multi_line_text = """
Hello, World!
This is a test.
"""
matches = re.findall(r'^.*!', multi_line_text, re.MULTILINE)
print("多行匹配结果:", matches) # 输出: ['Hello, World!']
# 使.匹配包括换行符在内的任意字符
dot_all_text = "Hello\nWorld!"
match = re.search(r'.*', dot_all_text, re.DOTALL)
if match:
print("包含换行符的匹配结果:", match.group()) # 输出: 包含换行符的匹配结果: Hello
# World!
作者:人工干智能