Python 正则表达式
正则表达式是一种用于匹配字符串的强有力的工具。它们是在各种编程语言中广泛应用的,包括 Python。在本文中,我们会详细阐述 Python 正则表达式的含义和使用方法。
正则表达式模块
在 Python 中,我们需要导入 re
模块才能使用正则表达式。以下是导入模块的代码示例:
import re
匹配字符
使用正则表达式时,我们可以使用字符来匹配相应的字符串。以下是正则表达式字符的列表:
字符 | 描述 |
---|---|
. | 匹配除了换行符外的任意字符 |
\w | 匹配字母、数字或下划线 |
\W | 匹配非字母、数字或下划线 |
\d | 匹配数字 |
\D | 匹配非数字 |
\s | 匹配任意空白字符 |
\S | 匹配非空白字符 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
下面是匹配字符的用例代码:
import re
text = "The quick brown fox jumps over the lazy dog."
pattern = r"fox"
matches = re.findall(pattern, text)
print(matches) # 输出 ["fox"]
匹配集合
我们可以使用方括号 []
来匹配字符集合。匹配集合中可以包括字符或字符范围。以下是匹配集合的代码示例:
import re
text = "John has 2 cats and 1 dog."
pattern = r"[0123456789]"
matches = re.findall(pattern, text)
print(matches) # 输出 ["2", "1"]
我们还可以使用 -
来指定字符范围。例如 [a-z]
表示匹配所有小写字母。以下是匹配字符集合的代码示例:
import re
text = "John has 2 cats and 1 dog."
pattern = r"[0-9]"
matches = re.findall(pattern, text)
print(matches) # 输出 ["2", "1"]
匹配重复次数
我们可以使用花括号 {}
来指定匹配重复次数。可以指定一个数字,表示该字符需要精确匹配该次数;或者指定范围,例如 {1,3}
表示该字符需要匹配 1 到 3 次。以下是匹配重复次数的代码示例:
import re
text = "abccbbcccddddeeeeffff"
pattern = r"c{2,3}"
matches = re.findall(pattern, text)
print(matches) # 输出 ["cc", "ccc"]
在以上例子中,我们匹配了字符串中连续出现 2 到 3 次的字符 c
。
匹配起始和结束
在有些情况下,我们需要匹配字符串的起始和结束位置。可以使用 ^
表示字符串的起始位置;使用 $
表示字符串的结束位置。以下是匹配起始和结束位置的代码示例:
import re
text = "The quick brown fox jumps over the lazy dog."
pattern = r"^T.*g\.$"
matches = re.findall(pattern, text)
print(matches) # 输出 ["The quick brown fox jumps over the lazy dog."]
在以上例子中,我们使用 ^T
匹配字符串的起始位置,使用 .*
匹配任意字符,使用 g\.
匹配结尾的字符 g.
。因此,输出为整个字符串。
分组匹配
在正则表达式中,我们可以将元素分成组,以便更方便地管理。可以使用圆括号 ()
将元素分成组。以下是分组匹配的代码示例:
import re
text = "John has 2 cats and 1 dog."
pattern = r"(cats|dog)"
matches = re.findall(pattern, text)
print(matches) # 输出 ["cats", "dog"]
在以上例子中,我们使用 ()
将元素分成两组:cats
和 dog
。使用 |
表示或逻辑运算,可以匹配两组中的任何一个。
替换字符
我们还可以使用正则表达式来替换字符串中的字符。可以使用 re.sub()
函数。以下是替换字符的代码示例:
import re
text = "John has 2 cats and 1 dog."
pattern = r"([0-9]+)"
replaced_text = re.sub(pattern, "number", text)
print(replaced_text) # 输出 "John has number cats and number dog."
在以上例子中,我们使用 ()
将匹配到的数字分组,然后使用 re.sub()
函数将匹配到的数字替换为字符串 "number"
。
贪婪与非贪婪匹配
当在一个正则表达式中出现多个匹配符时,默认情况下采用贪婪模式。这意味着,匹配字符会尽可能多地匹配,直到无法匹配为止。例如,在以下示例中,匹配符 .*
匹配了整个字符串,而不是匹配 "foo"
:
import re
text = "foo bar baz"
pattern = r"foo.*baz"
matches = re.findall(pattern, text)
print(matches) # 输出 ["foo bar baz"]
如果想要采用非贪婪模式,可以在匹配符后面添加 ?
。在以下示例中,匹配符 .*?
仅匹配到了 "foo"
:
import re
text = "foo bar baz"
pattern = r"foo.*?baz"
matches = re.findall(pattern, text)
print(matches) # 输出 ["foo baz"]
结论
正则表达式是 Python 中一种高效匹配字符串的工具。通过使用一些匹配字符、匹配集合、匹配重复次数、匹配起始和结束、分组匹配、替换字符等技术,我们可以根据需要匹配和替换字符串。同时,还需要注意贪婪和非贪婪匹配的区别,以便更好地运用正则表达式。