4

たとえば、私は次のようにしています。

string = "123ab4 5"

次のリストを取得できるようにしたいと思います。

["123","ab","4","5"]

list(string)ではなく:

["1","2","3","a","b","4"," ","5"]
4

5 に答える 5

8

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']
于 2012-11-19T16:18:46.420 に答える
1

他の解決策は間違いなく簡単です。それほど単純ではないものが必要な場合は、次のようなものを試すことができます。

>>> 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']
于 2012-11-19T16:24:03.003 に答える
1

あなたができること:

>>> [el for el in re.split('(\d+)', string) if el.strip()]
['123', 'ab', '4', '5']
于 2012-11-19T16:25:01.910 に答える
0

これにより、必要な分割が行われます。

re.findall(r'\d+|[a-zA-Z]+', "123ab4 5")

['123', 'ab', '4', '5']
于 2012-11-19T16:25:23.047 に答える
0

ここでいくつかのことができます

1.リストを繰り返し、数値のグループを作成して、結果リストに追加します。

素晴らしい解決策ではありません。

2.正規表現を使用します。

2の実装:

>>> import re
>>> s = "123ab4 5"
>>> re.findall('\d+|[^\d]', s)
['123', 'a', 'b', '4', ' ', '5']

\d+少なくとも1つの数字またはその他の文字であるグループを取得したい。

編集

ジョンは最初に正しい解決策に私を殴りました。そしてその素晴らしい解決策

他の誰かが質問を誤解して、私が書いたと思ったものに対する答えを探すかもし​​れないので、私はこれをここに残しておきます。私は、OPが数字のグループのみをキャプチャし、他のすべてを個別に残したいという印象を受けました。

于 2012-11-19T16:22:59.557 に答える