たとえば、私は次のようにしています。
string = "123ab4 5"
次のリストを取得できるようにしたいと思います。
["123","ab","4","5"]
list(string)ではなく:
["1","2","3","a","b","4"," ","5"]
1つ以上の隣接する数字(\d+
)を検索します。それが失敗した場合は、数字以外の非スペース文字([^\d\s]+
)を検索します。
>>> string = '123ab4 5'
>>> import re
>>> re.findall('\d+|[^\d\s]+', string)
['123', 'ab', '4', '5']
文字を結合したくない場合は、次のことを試してください。
>>> re.findall('\d+|\S', string)
['123', 'a', 'b', '4', '5']
他の解決策は間違いなく簡単です。それほど単純ではないものが必要な場合は、次のようなものを試すことができます。
>>> import string
>>> from itertools import groupby
>>> s = "123ab4 5"
>>> result = [''.join(list(v)) for _, v in groupby(s, key=lambda x: x.isdigit())]
>>> result = [x for x in result if x not in string.whitespace]
>>> result
['123', 'ab', '4', '5']
あなたができること:
>>> [el for el in re.split('(\d+)', string) if el.strip()]
['123', 'ab', '4', '5']
これにより、必要な分割が行われます。
re.findall(r'\d+|[a-zA-Z]+', "123ab4 5")
['123', 'ab', '4', '5']
ここでいくつかのことができます
1.リストを繰り返し、数値のグループを作成して、結果リストに追加します。
素晴らしい解決策ではありません。
2.正規表現を使用します。
2の実装:
>>> import re
>>> s = "123ab4 5"
>>> re.findall('\d+|[^\d]', s)
['123', 'a', 'b', '4', ' ', '5']
\d+
少なくとも1つの数字またはその他の文字であるグループを取得したい。
編集
ジョンは最初に正しい解決策に私を殴りました。そしてその素晴らしい解決策。
他の誰かが質問を誤解して、私が書いたと思ったものに対する答えを探すかもしれないので、私はこれをここに残しておきます。私は、OPが数字のグループのみをキャプチャし、他のすべてを個別に残したいという印象を受けました。