Python Regex
我正在尝试匹配来自遵循特定模式的用户输入的消息。第一种模式是关键字"data"后跟两位数字,第二种模式是关键词"status"后跟一个单词。我使用了if语句,它只在有一个模式要匹配的情况下有效,但不能同时匹配,因为第二个模式将被跳过。
import re
message = input('Enter Your Message?n')
trainee_data_pattern = re.compile(r"^(data)?s?(dd)$")
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->错误模式
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')
我通过将模式组合到一个正则表达式中并使用匹配组来创建条件来解决问题。
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')