您可以使用带有命名组的正则表达式。
基本上,您首先创建正则表达式(我创建了两个,一个用于数字优先的情况,另一个用于字母优先的情况)。然后您检查输入是否匹配。如果匹配,则在结果匹配对象上调用groupdict()
以获取类似{'digits':'11547', 'letters':'QSD'}
的字典。然后您只需使用它(我打印了它)。
遵循上述建议的完整示例:
>>> import re
>>> checks = [
re.compile(r'^(?P<digits>\d+)(?P<letters>\D+)$'),
re.compile(r'^(?P<letters>\D+)(?P<digits>\d+)$'),
]
>>> inputs = ['11547QSD', 'ABC98765', '111ABC111']
>>> for item in inputs:
for check in checks:
if check.match(item):
print('Digits are {digits}, letters are {letters}'.format(
**check.search(item).groupdict()
))
break
else:
print('%s is incorrect' % (item,))
Digits are 11547, letters are QSD
Digits are 98765, letters are ABC
111ABC111 is incorrect
简化版
如果您理解以上内容,可以缩短代码并创建结果字典(匹配字符串 - 结果组),如下:
>>> from itertools import product
>>> {item: check.search(item).groupdict()
for (item, check) in product(inputs, checks) if check.match(item)}
{'ABC98765': {'digits': '98765', 'letters': 'ABC'},
'11547QSD': {'digits': '11547', 'letters': 'QSD'}}
注意:
我使用了元字符\d
和\D
。第一个基本上意味着“数字”,第二个意味着“非数字”。有关它们的详细信息,请在这里查看。
isnumeric()
到isalpha()
的变化点,确保只有一个点,并在那里将其拆分。 - Elazar