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
我有一个功能可以分析银行转账的转账文本 (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