正则表达式匹配多个字符串

正则表达式匹配多个字符串

在日常开发中,我们经常需要用到正则表达式来匹配一些特定的字符串。当我们需要匹配多个字符串时,每个字符串都写上一个正则表达式是不现实的。所以我们需要学习如何用一个正则表达式同时匹配多个字符串。

方法一:用 | 符号分割字符串

| 符号在正则表达式中表示或。因此,我们可以用 | 符号将多个字符串分隔开来,表示匹配任意一个字符串。

例如,我们需要匹配 “foo”, “bar” 或 “baz” 这三个字符串,可以使用以下正则表达式:

import re

s = "foo bar baz"
pattern = r"foo|bar|baz"

result = re.findall(pattern, s)
print(result) # ['foo', 'bar', 'baz']

在这个示例中,我们使用 re 模块的 findall() 函数来匹配所有符合要求的子字符串。

方法二:用 [ ] 符号匹配多个字符

[ ] 符号在正则表达式中用来表示匹配任意一个字符。如果我们将多个要匹配的字符串放在 [ ] 中,就可以用同一个正则表达式匹配这些字符串了。

例如,我们需要匹配 “foo”, “bar” 或 “baz” 这三个字符串,可以使用以下正则表达式:

import re

s = "foo bar baz"
pattern = r"[fb]oo"

result = re.findall(pattern, s)
print(result) # ['foo']

在这个示例中,我们使用 [fb] 表示匹配字符 f 或 b,然后加上 o 和 o,即可匹配 “foo”。

方法三:用 ( ) 符号分组

( ) 符号在正则表达式中表示分组。如果我们将要匹配的字符串放在不同的 ( ) 中,就可以用同一个正则表达式匹配这些字符串了。

例如,我们需要匹配 “foo” 和 “bar” 这两个字符串,可以使用以下正则表达式:

import re

s = "foo bar"
pattern = r"(foo|bar)"

result = re.findall(pattern, s)
print(result) # ['foo', 'bar']

在这个示例中,我们使用 (foo|bar) 表示匹配 “foo” 或 “bar”,然后使用 re 模块的 findall() 函数匹配所有符合要求的子字符串。

方法四:用 (? ) 符号分组并命名

(?) 符号在正则表达式中用来给分组命名。如果我们需要同时匹配多个字符串,并且想要为每一个字符串命名,就可以使用此方法。

例如,我们需要匹配 “hello world” 和 “hola mundo” 这两个字符串,并分别命名为 eng 和 esp,可以使用以下正则表达式:

import re

s1 = "hello world"
s2 = "hola mundo"
pattern = r"(?P<eng>hello world)|(?P<esp>hola mundo)"

result1 = re.findall(pattern, s1)
result2 = re.findall(pattern, s2)

print(result1) # [('hello world', '')]
print(result2) # [('', 'hola mundo')]

在这个示例中,我们使用 (?Phello world) 来给 “hello world” 命名为 eng,用 (?Phola mundo) 来给 “hola mundo” 命名为 esp。

注意,这种方式下,返回的结果是一个元组序列,其中每个元组分别对应一个分组。在本示例中,由于每次只能匹配到一个字符串,因此有一个元组为空。

方法五:用 \b 符号定位单词边界

\b 符号在正则表达式中用来定位单词边界。如果我们需要匹配多个单词,就可以用\b 分隔它们,以保证匹配到的是完整的单词。

例如,我们需要匹配 “hello” 和 “world” 这两个单词,可以使用以下正则表达式:

import re

s = "hello world"
pattern = r"\b(hello|world)\b"

result = re.findall(pattern, s)
print(result) # ['hello', 'world']

在这个示例中,我们使用 \b(hello|world)\b 表示只匹配 “hello” 或 “world” 两个单词。

方法六:用 (?= ) 符号前向预查

(?= ) 符号在正则表达式中用来进行前向预查。如果我们要匹配多个字符串,且这些字符串都必须在某些位置出现,就可以使用前向预查。

例如,我们需要匹配 “foo” 和 “bar” 这两个字符串,且它们必须在 “hello” 后面出现,可以使用以下正则表达式:

import re

s = "hello foo bar"
pattern = r"(?<=hello )\b(foo|bar)\b"

result = re.findall(pattern, s)
print(result) # ['foo', 'bar']

在这个示例中,我们使用 (?<=hello ) 指定必须在 “hello” 后面匹配,然后再用 \b(foo|bar)\b 匹配 “foo” 或 “bar”。

方法七:用 (?<= ) 符号后向预查

(?<= ) 符号在正则表达式中用来进行后向预查。如果我们要匹配多个字符串,且这些字符串都必须在某些位置之前出现,就可以使用后向预查。

例如,我们需要匹配 “foo” 和 “bar” 这两个字符串,且它们必须在 “world” 前面出现,可以使用以下正则表达式:

import re

s = "foo bar world"
pattern = r"\b(foo|bar)\b(?= world)"

result = re.findall(pattern, s)
print(result) # ['foo', 'bar']

在这个示例中,我们使用 \b(foo|bar)\b 指定只匹配 “foo” 或 “bar”,然后再用 (?= world) 指定必须在 “world” 前面匹配。

结论

以上就是几种常见的方法,用一个正则表达式匹配多个字符串的实现方式。在使用时可以根据实际情况选择适合自己的方法。需要注意的是,有些方法可能会降低匹配效率,需要根据实际情况做出平衡。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程