文章目录
正则表达式
(Regular Expression,简称为 regex 或 regexp)是用于在文本中匹配模式的特殊字符串表达式。Python 中的 re 模块是用来处理正则表达式的工具,它提供了一种灵活、强大的方式来搜索、替换和操作文本数据。
findall
re.findall()
是 Python re
模块中一个常用的函数,用于在字符串中查找所有与给定正则表达式模式匹配的内容,并返回一个包含所有匹配项的列表。它的基本语法如下:
re.findall(pattern, string)
pattern
是一个正则表达式,用来描述你想要匹配的模式。string
是你要搜索的目标字符串。
例子:
假设有一个文本包含多个 email 地址,我们想要提取出这些 email 地址:
import re
text = "Email me at test@example.com or test2@example.com for more information."
emails = re.findall(r'\S+@\S+', text)
print(emails)
\S+@\S+
是一个简单的正则表达式模式,它匹配一个非空白字符序列,然后是 @ 符号,再后面跟着另一个非空白字符序列。这个模式描述了基本的 email 地址格式。
re.findall()
返回一个列表,其中包含在 text
中找到的所有与模式匹配的 email 地址。
特点和注意事项:
- 返回列表:
re.findall()
返回所有匹配项组成的列表。 - 不返回匹配对象:与
re.search()
或re.match()
不同,findall()
不返回匹配对象,而是返回匹配的字符串本身。 - 模式中的分组:如果模式中有分组
( )
,re.findall()
会返回元组的列表,每个元组包含匹配到的分组内容。
import re
text = "John has 3 cats, Jane has 2 dogs."
matches = re.findall(r'(\d+)\s(\w+)', text)
print(matches) # Output: [('3', 'cats'), ('2', 'dogs')]
这个例子中,正则表达式 (\d+)\s(\w+)
匹配了一些数字和接着的字母单词,并且使用了分组。re.findall()
返回了包含每个匹配组合的元组列表。
re.findall()
在处理文本、数据抽取、简单的文本匹配等任务中都非常有用,但要注意在处理复杂匹配模式时,可能需要更深入的了解和测试正则表达式。
match
re.match()
是 Python 中 re
模块的一个函数,用于在字符串的开头位置查找是否有符合给定正则表达式模式的内容。这个函数尝试从字符串的起始位置开始匹配模式,如果找到匹配,它将返回一个匹配对象;如果没有找到匹配,则返回 None
。
这是 re.match()
函数的基本语法:
re.match(pattern, string)
pattern
是一个正则表达式,用于描述你想要匹配的模式。string
是要搜索的目标字符串。
示例:
假设我们想要验证一个字符串是否以 “Hello” 开头:
import re
text = "Hello, how are you?"
match = re.match(r'Hello', text)
if match:
print("Pattern found:", match.group())
else:
print("Pattern not found.")
在这个例子中,re.match()
尝试从字符串的开头匹配模式 “Hello”。如果找到匹配,它会返回一个匹配对象,否则返回 None
。
match
对象的方法和属性:
group()
: 返回与整个匹配的字符串。start()
: 返回匹配的起始位置。end()
: 返回匹配的结束位置。span()
: 返回一个元组,包含匹配 (开始, 结束) 的位置。
import re
text = "Hello, how are you?"
match = re.match(r'Hello', text)
if match:
print("Matched string:", match.group())
print("Start position:", match.start())
print("End position:", match.end())
print("Position span:", match.span())
注意事项:
re.match()
只在字符串的开头位置进行匹配。如果你想要在整个字符串中查找匹配,可以使用re.search()
。- 如果匹配成功,
re.match()
返回的是一个匹配对象,你可以使用它的方法来获取匹配结果,如group()
、start()
等。 - 如果没有找到匹配,
re.match()
将返回None
。
re.match()
对于需要精确匹配字符串开头的情况非常有用,但如果你需要在字符串中间或结尾位置进行匹配,可以考虑使用 re.search()
函数。
search
re.search()
是 Python 中 re
模块的函数之一,用于在给定的字符串中搜索匹配指定正则表达式模式的内容。与 re.match()
不同,re.search()
不仅仅在字符串的开头进行匹配,而是搜索整个字符串,找到第一个匹配项后便停止搜索,并返回一个匹配对象。
这是 re.search()
函数的基本语法:
re.search(pattern, string)
pattern
是一个正则表达式,用于描述你想要匹配的模式。string
是要搜索的目标字符串。
示例:
假设我们想要在一个字符串中找到数字的位置:
import re
text = "The price is $25.50."
match = re.search(r'\d+', text)
if match:
print("Pattern found:", match.group())
print("Start position:", match.start())
print("End position:", match.end())
print("Position span:", match.span())
else:
print("Pattern not found.")
在这个例子中,re.search()
在给定的字符串中搜索数字 \d+
的模式。如果找到匹配,它将返回一个匹配对象,否则返回 None
。
match
对象的方法和属性:
group()
: 返回与整个匹配的字符串。start()
: 返回匹配的起始位置。end()
: 返回匹配的结束位置。span()
: 返回一个元组,包含匹配 (开始, 结束) 的位置。
注意事项:
re.search()
会在整个字符串中查找第一个匹配项。如果需要查找所有匹配项,可以使用re.findall()
。- 如果找到匹配,
re.search()
返回的是一个匹配对象,你可以使用它的方法来获取匹配结果,如group()
、start()
等。 - 如果没有找到匹配,
re.search()
将返回None
。
re.search()
在需要在字符串中查找第一个匹配项时非常有用,尤其是当你不确定匹配项出现在字符串的什么位置时。
split
re.split()
是 Python re
模块中的一个函数,用于根据正则表达式模式分割字符串。它的作用类似于 str.split()
方法,但不是根据固定的字符分割字符串,而是根据给定的正则表达式模式进行分割。
这是 re.split()
函数的基本语法:
re.split(pattern, string)
pattern
是一个正则表达式,用于描述你想要作为分隔符的模式。string
是要分割的目标字符串。
示例:
假设我们有一个句子,想要根据空格和标点符号分割它:
import re
text = "Hello, how are you?"
tokens = re.split(r'\W+', text)
print(tokens)
在这个例子中,re.split()
根据模式 \W+
(非字母数字下划线的字符)对文本进行分割。它返回一个由分割后的子字符串组成的列表。
参数说明:
pattern
定义了分隔符的模式。可以是单个字符,也可以是更复杂的正则表达式。string
是要分割的目标字符串。
注意事项:
- 如果模式中有括号,那么括号内的内容也会被包含在结果列表中。
- 如果模式中使用了捕获分组,那么分隔符也会包含在结果列表中。
re.split()
不会在最后的空字符串位置进行分割,因此不会返回末尾的空字符串。
示例说明:
import re
text = "apple, orange, , banana, , mango"
tokens = re.split(r',\s*', text)
print(tokens)
这个例子中,模式 ,\\s*
匹配逗号后面的零个或多个空格。re.split()
根据这个模式分割字符串,并返回一个由分割后的子字符串组成的列表。结果列表中不包含末尾的空字符串。
re.split()
是一个很有用的函数,特别适用于需要根据复杂模式进行字符串分割的情况。
sub
re.sub()
是 Python 中 re
模块的一个函数,用于在字符串中查找与给定正则表达式模式匹配的内容,并将其替换为指定的字符串。它允许你执行在文本中查找并替换特定模式的操作。
这是 re.sub()
函数的基本语法:
re.sub(pattern, replacement, string)
pattern
是一个正则表达式,用于描述你想要匹配的模式。replacement
是要替换匹配内容的字符串。string
是要在其中进行替换操作的目标字符串。
示例:
假设我们想要在文本中替换所有数字为字符串 “NUMBER”:
import re
text = "I have 2 apples and 3 oranges."
new_text = re.sub(r'\d+', 'NUMBER', text)
print(new_text)
在这个例子中,re.sub()
将查找文本中的所有数字,并用字符串 “NUMBER” 替换它们。
参数说明:
pattern
定义了要查找和替换的模式。这可以是简单的字符,也可以是更复杂的正则表达式。replacement
是要替换匹配内容的字符串。string
是要在其中进行替换操作的目标字符串。
可选参数:
re.sub()
函数还包含两个可选参数:
count
: 指定替换的最大次数。默认是 0,表示所有匹配都会被替换。flags
: 匹配模式。例如,re.IGNORECASE
可以用来进行不区分大小写的匹配。
示例说明:
import re
text = "The color of the sky is blue."
new_text = re.sub(r'blue', 'red', text)
print(new_text)
在这个例子中,re.sub()
将找到文本中的 “blue” 并用 “red” 进行替换。
re.sub()
函数是处理文本替换非常有用的工具。它可以用于简单的字符串替换,也可以使用更复杂的正则表达式模式进行高级替换操作。