如何在Python中匹配精确的“多个”字符串

22 投票
5 回答
68413 浏览
提问于 2025-04-16 11:33

我有一份需要在某个字符串中查找的确切模式列表。目前我用的方法很糟糕。

pat1 = re.compile('foo.tralingString')
mat1 = pat1.match(mystring)

pat2 = re.compile('bar.trailingString')
mat2 = pat2.match(mystring)

if mat1 or mat2:
    # Do whatever

pat = re.compile('[foo|bar].tralingString')
match = pat.match(mystring) # Doesn't work

唯一的条件是,我有一组字符串需要完全匹配。用Python有什么好的解决方案吗?

补充说明:这些搜索模式有一些共同的后缀。

5 个回答

2

在你的正则表达式中使用'|'。它的意思是“或者”。如果你想要处理字符串,还有更好的方法,可以使用re.escape这个功能。

pat = re.compile('|'.join(map(re.escape, ['foo.tralingString','bar.tralingString','something.else'])))
10

你说得对,使用 | 是正确的,但你用的是字符类 [],而不是子模式 ()。试试这个正则表达式:

r = re.compile('(?:foo|bar)\.trailingString')

if r.match(mystring):
    # Do stuff

旧的回答

如果你想要精确匹配子字符串,就不应该使用正则表达式。

可以试试用 in 来代替:

words = ['foo', 'bar']

# mystring contains at least one of the words
if any(i in mystring for i in words):
    # Do stuff
32

你可以写一个简单的正则表达式,把这两个结合起来:

pat = re.compile('foo|bar')
if pat.match(mystring):
    # Do whatever

然后你可以扩展这个正则表达式,做你需要的事情,使用 | 这个符号(在正则表达式中表示

编辑:根据你最近的修改,这个应该能满足你的需求:

pat = re.compile('(foo|bar)\\.trailingString');
if pat.match(mystring):
    # Do Whatever

[] 是一个字符类。所以你的 [foo|bar] 会匹配包含一个这些字符的字符串(因为在字符类后面没有 *、+ 或 ?)。() 是用来包裹子模式的。

撰写回答