我有一个像这样的字符串“11547QSD”。我想把它分成两部分“11547”和“QSD”。我得到了一个isnumeric()函数的提示。我正在向下概述。请给我一个分解这个的最佳方法。
str1 = "11547QSD" # is a valid string (in my context)
str2 = "ABC98765" # is a valid string
str3 = "111ABC111" # is not a valid string
if str1.isvalid():
str1_int = str1.integer_part()
str1_str = str1.string_part()
提前致谢
答案 0 :(得分:5)
您可以使用带有命名组的正则表达式。
你基本上首先创建正则表达式(我为两种情况创建了两个:首先是数字或先是字母)。然后检查输入是否匹配。如果是,则在生成的匹配对象上调用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
如果您了解上述内容,则可以缩短代码并创建生成的dict(匹配字符串 - 结果组),如下所示:
>>> 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
。第一个基本上表示“数字”,第二个表示“非数字”。关于它们的含义的详细信息是here。
答案 1 :(得分:0)
我认为正则表达式应该是最好的解决方案,例如:
import re
re.split(r'(\d+|\(|\))', '11547QSD')
答案 2 :(得分:0)
from string import ascii_letters, digits
s_int, s_str = sorted([s.strip(ascii_letters), s.strip(digits)])
is_valid = s in {s_int+s_str, s_str+s_int}
答案 3 :(得分:0)
主要是为了好玩:
ss = ["11547QSD", "ABC98765", "111ABC111"]
fmt = r'\A(?P<full>{0}{1})\Z'
ps = [r'(?P<digits>\d+)', r'(?P<letters>[A-Z]+)']
fs = [fmt.format(*sorted(ps, reverse = b)) for b in [False, True]]
rs = [re.compile(f) for f in fs]
ms = filter(None, (r.search(s) for s in ss for r in rs))
gds = [m.groupdict() for m in ms]
for gd in gds:
print gd
# Output:
# {'digits': '11547', 'full': '11547QSD', 'letters': 'QSD'}
# {'digits': '98765', 'full': 'ABC98765', 'letters': 'ABC'}