如何修复python regex if语句?

57hvy0tb  于 2023-06-07  发布在  Python
关注(0)|答案(2)|浏览(145)

我想在一个数据框里找到一些短语。以下是我想找到的单词组合:

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个匹配单词时不起作用。我该怎么解决这个问题?
谢谢你花时间阅读和帮助。我真的很感激!

cidc1ykv

cidc1ykv1#

这是因为代码中比较的顺序。

row = 'apple, banana, and orange'

if re.match(r'(?=.*\bbananas?\b)', row):
    print('apples and bananas')
elif re.match(r'(?=.*\bbananas?\b)(?=.*\boranges?\b)', row):
    print('apples, bananas, and oranges')
apples and bananas

elif是“else if”-所以如果bananas匹配,则不执行elif代码。
如果你的模式是其他模式的“子集”,你必须首先检查较长的模式:

if re.match(r'(?=.*\bbananas?\b)(?=.*\boranges?\b)', row):
    print('apples, bananas, and oranges')
elif re.match(r'(?=.*\bbananas?\b)', row):
    print('apples and bananas')
apples, bananas, and oranges
vawmfj5a

vawmfj5a2#

除此之外,你必须在if else匹配中将更具体的匹配移动到更高的位置,你不需要所有这些查找。你也可以把它们匹配起来。
对于像这样的((?=.*apple)|(?=.*apples))结构,您不需要任何查找。这与匹配\bapples?\b相同,其中s字符是可选的。
同样使用re.match从字符串的开头进行匹配,所以匹配\bno\b(也可以写成no\b)并不意味着匹配了no apples,而是匹配了字符串开头的no
只有当所有的字符串都具有相同的格式时,您才能确定这一点。
这也适用于最后一个你打印香蕉,但你没有真正匹配香蕉的地方。
如果你想在字符串中找到匹配的第一个位置,可以使用re.search。
例如,你可以让代码更具体一点:

for i in copy.loc[fruits]:
    print(i)

    if re.search(r'\bapples?\b', i):

        if re.search(r'(\bno apples?\b)', i):
            print('no apples, only banana and oranges')
            print('')

        elif re.match(r'(?=.*\bbananas?\b).*\boranges?\b', i):
            print('apples, bananas, and oranges')
            print('')

        elif re.search(r'\boranges?\b', i):
            print('apples and oranges')
            print('')

        elif re.search(r'\bbananas?\b', i):
            print('apples and bananas')
            print('')
        else:
            print('apples')
            print('')

    elif re.search(r'\boranges?\b', i):
        print('oranges')
        print('')

    elif re.search(r'\bbananas?\b', i):
        print('bananas')
        print('')
    else:
        print("other..")
        print('')

相关问题