3

この「11547QSD」のような文字列を持っています。「11547」と「QSD」の2つに分けたいと思います。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()

前もって感謝します

4

4 に答える 4

5

名前付きグループで正規表現を使用できます。

基本的には、最初に正規表現を作成します (どちらの場合も、最初に数字または最初に文字の 2 つを作成しました)。次に、入力が一致するかどうかを確認します。一致する場合は、結果の一致オブジェクトを呼び出し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. 1 つ目は基本的に「数字」を意味し、2 つ目は「非数字」を意味します。それらが何を意味するかについての詳細はここにあります。

于 2013-06-06T06:02:28.990 に答える
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}
于 2013-06-06T05:08:28.203 に答える
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'}
于 2013-06-06T05:49:33.507 に答える
0

正規表現が最善の解決策であると思います。例:

import re
re.split(r'(\d+|\(|\))', '11547QSD')

于 2013-06-06T04:58:53.423 に答える