将字符串拆分为整数部分和字符串部分的最佳方法是什么?

Viv*_*vek 3 python regex string

我有一个像这样的字符串"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()
Run Code Online (Sandbox Code Playgroud)

提前致谢

Tad*_*eck 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
Run Code Online (Sandbox Code Playgroud)

缩短版

如果您了解上述内容,则可以缩短代码并创建生成的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'}}
Run Code Online (Sandbox Code Playgroud)

注意:

我使用了元字符\d\D.第一个基本上表示"数字",第二个表示"非数字".关于它们的含义的细节在这里.