我想在一个数据框里找到一些短语。以下是我想找到的单词组合:
apples
bananas
oranges
apples and bananas
apples and oranges
bananas and oranges
apples, bananas, and oranges
然而,我的代码不适用于只有2个匹配单词的情况。例如,如果a行包含'apple, banana, and orange'
,我的代码将只输出'apple and banana'
。
这是我的代码:
for i in copy.loc[fruits]:
print(i)
#if match apple
if re.match(r'((?=.*apple)|(?=.*apples))',i):
#if says no apple
if re.match(r'(\bno\b)',i) :
print('no apples, only banana and oranges')
print('')
#if has apple and orange
elif re.match(r'(?=.*orange)|(?=.*\boranges\b)',i):
print('apples and oranges')
print('')
#if has apple and banana
elif re.match(r'(?=.*banana)|(?=.*bananas)',i):
print('apples and bananas')
print('')
#has apple, banana, and orange
elif re.match(r'(?=.*banana)|(?=.*bananas)(?=.*orange)|(?=.*\boranges\b)',i):
print('apples, bananas, and oranges')
print('')
#has only apple
else:
print('apples')
print('')
#only oranges
elif re.match(r'(?=.*orange)|(?=.*\boranges\b)',i):
print('oranges')
print('')
#only banana
else:
print('bananas')
print('')
我的代码在只有2个匹配单词时不起作用。我该怎么解决这个问题?
谢谢你花时间阅读和帮助。我真的很感激!
2条答案
按热度按时间cidc1ykv1#
这是因为代码中比较的顺序。
elif
是“else if”-所以如果bananas匹配,则不执行elif
代码。如果你的模式是其他模式的“子集”,你必须首先检查较长的模式:
vawmfj5a2#
除此之外,你必须在if else匹配中将更具体的匹配移动到更高的位置,你不需要所有这些查找。你也可以把它们匹配起来。
对于像这样的
((?=.*apple)|(?=.*apples))
结构,您不需要任何查找。这与匹配\bapples?\b
相同,其中s
字符是可选的。同样使用re.match从字符串的开头进行匹配,所以匹配
\bno\b
(也可以写成no\b
)并不意味着匹配了no apples
,而是匹配了字符串开头的no
。只有当所有的字符串都具有相同的格式时,您才能确定这一点。
这也适用于最后一个你打印香蕉,但你没有真正匹配香蕉的地方。
如果你想在字符串中找到匹配的第一个位置,可以使用re.search。
例如,你可以让代码更具体一点: