Python:一个包含带“|”、(和)运算符的元素的列表

Python: a list with an Element with "|", (and) operator

我有一个功能可以分析银行转账的转账文本 (buchungstext)。 Python 查找是否包含在传输文本(buchungstext) 中的单词然后 returns 一个 GUID,GUID 就是目标预订帐户。但是现在我想如果在列表中不仅搜索一个词,而且需要两个词进行 AND 运算。重要的是,句子中的单词也可以扭曲。

我以前这样试过:'LINEA'|'MADRID'

buchungstext = "METRO MADRID LINEA 7 MASTERCARD - MADRID " 


    # Tickets und Transport
    elif any(wort.upper() in buchungstext.upper() for wort in [  'LINEA'|'MADRID'   ,'METRO BARCELONA','METRO DE MADRID','LUFTHANSA','Trainline','SNCF TGV.COM','LIM*FAHRTKOSTEN','DB Reisezentrum','FINNAIR','DB Vertrieb GmbH','BOLT.EU','OEBB', 'DB BAHN A-NR','UBER','Flixbus','TIER','MVG RAD']):
        GUIDzwei = "d45xxxxxxxxxxxxxx013ab953ef26af2"
        return()



    # Hotels
    elif any(wort.upper() in buchungstext.upper() for wort in ['Hotel']):
        GUIDzwei = "d45xxxxxxxxxxxxxx013ab953ef26af2"
        return()

    # Mailservices, Post, DHL
    elif any(wort.upper() in buchungstext.upper() for wort in ['bpost','Deutsche Post','UPS','DHL']):
        GUIDzwei = "d45xxxxxxxxxxxxxx013ab953ef26af2"
        return()

# etc....

您可以将 in 更改为 re.search。 主要问题是如何以任何顺序搜索所有提供的单词的存在。我们可以用 regex lookahead

r"(?=.*WORD1)(?=.*WORD2)"

所以你的关键部分可能看起来像这样:

any(re.search(wort, buchungstext, re.I | re.DOTALL) for wort in [r"(?=.*LINEA)(?=.*MADRIT)", "LUFTHANSA", "..."])

I 标志用于忽略大小写搜索

DOTALL 标志使 .* 也匹配换行符

你不能只使用 for wort in [ 'LINEA', 'MADRID' ,'METRO BARCELONA', ...] 吗,只要当你在列表中查找单词时,隐含了 or 操作?

如果我对问题的理解正确,这可能会有所帮助。

您有一个字符串 (buchungstext),其中包含许多以空格分隔的单词。

您想查明该字符串中是否存在 所有 个词组。

搜索不区分大小写。

因此:

buchungstext = "METRO MADRID LINEA 7 MASTERCARD - MADRID"

def check(sentence, words):
    # tokenise and convert to lowercase
    los = {w.lower() for w in sentence.split()}
    return all(k.lower() in los for k in words)

print(check(buchungstext, ['mastercard', 'metro']))
print(check(buchungstext, ['mastercard', 'munich']))

输出:

True
False

这为作为第二个参数传递的列表提供了逻辑 AND。如果你想要逻辑 OR 只需将 all 更改为 any