正则表达式匹配多个字符串
在日常开发中,经常会遇到需要匹配多个字符串的情况,而正则表达式正是能够应对这种情况的利器。在本文中,我们将学习如何使用正则表达式匹配多个字符串。
使用括号表达多个选择
正则表达式中的括号 ()
可以表示多个选项,其中每个选项用竖线 |
分隔。例如,下面的正则表达式能够匹配字符串 “apple”、”banana” 或者 “orange”:
(apple|banana|orange)
我们可以使用 Python 代码测试一下上述正则表达式:
import re
pattern = r"(apple|banana|orange)"
text = "I like apple, do you like banana or orange?"
result = re.findall(pattern, text)
print(result) # 输出 ['apple', 'banana', 'orange']
可以看到,上述代码输出了字符串中所有匹配上的子串。由于我们使用了括号表达多个选择,每个选择都是可选的,因此可以匹配多个字符串。
使用方括号表达多个字符
除了可以使用括号表达多个字符串选择,还可以使用方括号 []
表达多个字符的选择。在方括号中,每个字符代表一种选择,多个字符之间用逗号 ,
分隔。例如,下面的正则表达式能够匹配字符串 “apple”、”banana” 或者 “orange”:
[aob]pple
代码实现如下:
import re
pattern = r"[aob]pple"
text = "I like apple, do you like banana or orange?"
result = re.findall(pattern, text)
print(result) # 输出 ['apple', 'orange']
可以看到,正则表达式 [aob]pple
匹配了字符串中 “apple” 和 “orange” 这两个子串。使用方括号表达式可以在匹配时更加灵活。
表达子字符串的重复
在正则表达式中,通过使用特定的符号来表达子字符串的出现次数,常见的包括 *
、+
、?
以及花括号 {}
。
*
表示匹配零次或多次,等价于{0,}
;+
表示匹配一次或多次,等价于{1,}
;?
表示匹配零次或一次,等价于{0,1}
;{m}
表示匹配恰好 m 次;{m,}
表示匹配至少 m 次;{m,n}
表示匹配 m 到 n 次。
例如,下面的正则表达式能够匹配多个 “a”:
a*
Python 实现如下:
import re
pattern = r"a*"
text = "aaabbbaaa"
result = re.findall(pattern, text)
print(result) # 输出 ['', 'aaa', '', '', '', 'aaa', '']
可以看到,正则表达式 a*
匹配了字符串中所有的 “a”,连续出现的 “a” 可以被匹配多次。
再看一个例子,下面的正则表达式能够匹配一个字母后跟着一个数字:
[a-z]\d
Python 实现如下:
import re
pattern = r"[a-z]\d"
text = "c3h5oh"
result = re.findall(pattern, text)
print(result) # 输出 ['c3', 'h5']
可以看到,正则表达式 [a-z]\d
匹配了字符串中所有的 “c3” 和 “h5″。
使用圆括号提取匹配结果
在正则表达式中,可以使用圆括号 ()
将一个子表达式分组,分组后的子表达式可以作为一个整体进行操作,例如提取匹配的结果。
例如,下面的正则表达式可以匹配形如 “xxx年xx月xx日” 这样的日期格式,并通过分组提取年、月、日:
(\d{4})年(\d{1,2})月(\d{1,2})日
Python 实现如下:
import re
pattern = r"(\d{4})年(\d{1,2})月(\d{1,2})日"
text = "今天是2022年9月24日"
result = re.search(pattern, text)
print(result.group(0)) # 输出 2022年9月24日
print(result.group(1)) # 输出 2022
print(result.group(2)) # 输出 9
print(result.group(3)) # 输出 24
可以看到,正则表达式 (\d{4})年(\d{1,2})月(\d{1,2})日
提取了字符串中的年、月、日,并且可以通过 group()
方法分别获取到每个分组的匹配结果。在实际应用中,通过圆括号分组可以方便地提取匹配结果,提高代码的灵活性和效率。
操作字符串的边界
在正则表达式中,可以使用特殊字符 ^
和 $
表示字符串的开头和结尾。例如,下面的正则表达式能够匹配以 “apple” 开头的字符串:
^apple
Python 实现如下:
import re
pattern = r"^apple"
text = "apple is a fruit, banana is also a fruit"
result = re.findall(pattern, text)
print(result) # 输出 ['apple']
可以看到,正则表达式 ^apple
匹配了字符串中的 “apple”,但没有匹配 “banana”,因为 “banana” 不是以 “apple” 开头的。
另外,如果想要匹配以特定字符结尾的字符串,可以使用 $
符号。例如,下面的正则表达式能够匹配以 “.jpg” 结尾的字符串:
.jpg$
Python 实现如下:
import re
pattern = r"\.jpg$"
text = "image1.jpg, image2.png, image3.jpg"
result = re.findall(pattern, text)
print(result) # 输出 ['.jpg', '.jpg']
可以看到,正则表达式 \.jpg$
只匹配了字符串中以 “.jpg” 结尾的子串,即 “image1.jpg” 和 “image3.jpg”。
总结
本文介绍了如何使用正则表达式匹配多个字符串,包括使用括号表达多个选择、使用方括号表达多个字符、表达子字符串的重复、使用圆括号提取匹配结果和操作字符串的边界。在实际开发中,合理使用正则表达式可以大大提升代码的灵活性和效率。