如何验证输入字符串是否包含PO Box前缀(忽略后续数字)
嘿,这个问题我熟!你原来的代码是精确匹配整个字符串,但实际用户输入的PO Box后面都会跟着数字,所以得改成检查字符串里是否包含那些PO相关的前缀,不管后面的内容。我给你几个实用的方案:
1. 简化匹配逻辑(忽略大小写+包含检查)
首先你可以把原来的大小写冗余数组简化,然后统一转成小写来匹配,这样不用维护各种大小写组合:
# 只保留基础的小写前缀,覆盖所有大小写变体 PO_PREFIXES = ['p.o. box', 'po box'] # 把输入值转成小写,统一匹配规则 input_value = Resp_Info.r3.val.lower() # 检查输入是否包含任意一个PO前缀 if any(prefix in input_value for prefix in PO_PREFIXES): error('Sorry, but we cannot accept PO boxes.')
这个方法的好处是:
- 不用维护原来那一大串大小写组合的数组,精简又高效
- 不管PO前缀在字符串的哪个位置(开头、中间)都会触发检查,适合各种输入场景
2. 更精准的开头匹配(符合地址输入习惯)
如果你的场景里PO Box通常出现在地址开头,用startswith会更精准,避免误判其他包含PO的无关内容:
PO_PREFIXES = ['p.o. box', 'po box'] input_value = Resp_Info.r3.val.lower() if any(input_value.startswith(prefix) for prefix in PO_PREFIXES): error('Sorry, but we cannot accept PO boxes.')
3. 正则表达式(精准匹配带数字的PO Box)
如果要确保触发错误的是带数字的PO Box地址(避免误判单独输入"PO Box"的情况),可以用正则表达式:
import re # 正则匹配:以PO前缀开头,后面跟着任意空格+数字 PO_REGEX_PATTERNS = [ r'^p\.o\. box\s*\d+', r'^po box\s*\d+' ] input_value = Resp_Info.r3.val.lower() for pattern in PO_REGEX_PATTERNS: if re.match(pattern, input_value): error('Sorry, but we cannot accept PO boxes.') break
这个正则的意思是:
^表示字符串开头p\.o\. box匹配"p.o. box"(转义点号避免匹配任意字符)\s*匹配任意数量的空格(包括0个)\d+匹配一个或多个数字
这样就能精准识别像"PO Box 1167"、"p.o. box 456"这类带数字的PO地址啦!
内容的提问来源于stack exchange,提问作者Michael O'Hanlon
相关产品推荐
相关产品推荐

