【问题标题】:match different message patterns from a user input in Python匹配来自 Python 中用户输入的不同消息模式
【发布时间】:2021-12-05 22:36:28
【问题描述】:

我正在尝试匹配来自遵循特定模式的用户输入的消息。第一个模式是关键字“数据”后跟两位数字,第二个模式是关键字“状态”后跟一个单词。我使用了 if 语句,它仅在有一个要匹配的模式时才有效,但不能同时匹配两个模式,因为第二个模式将被跳过。

import re


message = input('Enter Your Message?\n')



trainee_data_pattern = re.compile(r"^(data)?\s?(\d\d)$")
data_match = trainee_data_pattern.search(message)
trainee_status_pattern = re.compile(r"^(status)?\s?(\w+)$")
status_match = trainee_status_pattern.search(message)

try:
    if data_match.group() == message:
        matched_num = trainee_data_pattern.search(message).group(2)
        
        list1 = [11,22,33]
        if int(matched_num) in list1:
            print(f"ID: {matched_num}")
                
        else:
            print('no data')
        
    elif status_match.group() == message:  
    
        matched_status = trainee_status_pattern.search(message).group(2)
        
        list2 = ['good','bad','refurbished']
        if matched_status in list2:
            print(f"the status is {matched_status}")
                
        else:
            print('no data')
            
except AttributeError:
      res = trainee_data_pattern.search(message) 
      print('wrong pattern')

程序所需的功能是当用户输入: 数据 22 -> ID:22

状态良好 -> 状态良好

数据 133 -> 错误模式

【问题讨论】:

    标签: python if-statement python-re


    【解决方案1】:

    re.MatchObject.group() Python 正则表达式中的函数raise AttributeError if a matching pattern is not found.

    在您的情况下,如果输入是例如“状态良好”,代码在第一个 if 语句中引发错误,并且代码正在执行,除了块。在这种情况下,代码永远不会传递给您的 elif 块

    你可以这样做:

    import re
    
    message = input('Enter Your Message?\n')
    
    trainee_data_pattern = re.compile(r"^(data)\s(\d+)\s(\d+)")
    trainee_status_pattern = re.compile(r"^(status)\s(\w+)")
    
    match = trainee_data_pattern.search(message)
    if match:
        matched_num = trainee_data_pattern.search(message).group(2)
        list1 = [11, 22, 33]
        if int(matched_num) in list1:
            print(f"ID: {matched_num}")
        else:
            print('no data')
    else:
        match = trainee_status_pattern.search( message)
        if match:
            matched_status = trainee_status_pattern.search(message).group(2)
            list2 = ['good', 'bad', 'refurbished']
            if matched_status in list2:
                print(f"the status is {matched_status}")
            else:
                print('no data')
    

    【讨论】:

    • 感谢您的回复!但这是否意味着不能匹配来自用户的多个输入模式?有其他选择吗?
    • @BACHASH 我编辑了我的帖子
    【解决方案2】:

    我通过将模式组合成一个正则表达式解决了这个问题,而是使用匹配组来创建条件。

    import re
    
    message = input('Enter Your Message?\n')
    
    general_pattern = re.compile(r"^(status|data)\s?(\d{2}|\w+)$")
    data_match = general_pattern.search(message)
    
    
    try:
        if data_match.group(1) == 'data':
            list1 = [11, 22, 33]
            mapped_list = map(str, list1)
            if data_match.group(2) in list(mapped_list):
                print(f"ID: {data_match.group(2)}")
            else:
                print('no data')
    
        elif data_match.group(1) == 'status':
            list2 = ['good', 'bad', 'refurbished']
            if data_match.group(2) in list2:
                print(f"the status is {data_match.group(2)}")
            else:
                print('no data')
    
    except AttributeError:
        data_match = general_pattern.search(message)
        print('wrong pattern')
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-30
      • 2013-12-04
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多