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

时间:2011-02-10 04:09:49

标签: python regex

我有一个我想要在给定字符串中搜索的确切模式列表。目前我对这样的问题有一个非常糟糕的解决方案。

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 个答案:

答案 0 :(得分:19)

你可以做一个简单的正则表达式,结合这两个:

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

然后,您可以使用|分隔符(在regex语法中表示)扩展正则表达式以执行您需要的任何操作

修改:根据您最近的修改,这应该为您完成:

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

[]是一个字符类。因此,您的[foo|bar]会匹配包含一个字符串的字符串(因为课后没有*或+或?)。 ()是子模式的附件。

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

在正则表达式中使用'|'。它代表'OR'。当你想要re.escape字符串

时,还有更好的方法
pat = re.compile('|'.join(map(re.escape, ['foo.tralingString','bar.tralingString','something.else'])))

答案 3 :(得分:1)

您要搜索模式字符串吗?每种方法的最佳解决方案都非常不同:

# strings
patterns = ['foo', 'bar', 'baz']
matches = set(patterns)

if mystring in matches:     # O(1) - very fast
    # do whatever


# patterns
import re
patterns = ['foo', 'bar']
matches = [re.compile(pat) for pat in patterns]

if any(m.match(mystring) for m in matches):    # O(n)
    # do whatever

编辑:好的,您想在搜索字符串的开头搜索可变长度的完全字符串;尝试

from collections import defaultdict
matches = defaultdict(set)

patterns = ['foo', 'barr', 'bazzz']
for p in patterns:
    matches[len(p)].add(p)

for strlen,pats in matches.iteritems():
    if mystring[:strlen] in pats:
        # do whatever
        break

答案 4 :(得分:0)

也许

any([re.match(r, mystring) for r in ['bar', 'foo']])

我假设您的匹配模式比foo或bar更复杂;如果他们不是,请使用

if mystring in ['bar', 'foo']: