簡體   English   中英

如何在 Python 中匹配精確的“多個”字符串

[英]How to match exact “multiple” strings in Python

我有一個我想在給定字符串中搜索的確切模式列表。 目前,我對這樣的問題有一個非常糟糕的解決方案。

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 中最好的解決方案。

編輯:搜索模式有一些常見的尾隨模式。

你可以做一個簡單的正則表達式,結合這兩者:

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]將匹配包含其中一個字符的字符串(因為類之后沒有 * 或 + 或 ? )。 ()是子模式的外殼。

你是正確的使用| 但是您使用的是字符類[]而不是子模式() 試試這個正則表達式:

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

使用“|” 在你的正則表達式中。 它代表“或”。 還有更好的方法,當你想重新轉義你的字符串時

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

您要搜索模式還是字符串 每個人的最佳解決方案是非常不同的:

# 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

可能

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

我假設你的匹配模式會比 foo 或 bar 更復雜; 如果不是,請使用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM