78

このような文字列を分割したい

'foofo21'
'bar432'
'foobar12345'

の中へ

['foofo', '21']
['bar', '432']
['foobar', '12345']

誰かがPythonでこれを行う簡単で簡単な方法を知っていますか?

4

10 に答える 10

74

私はre.match次の方法でこれにアプローチします。

import re
match = re.match(r"([a-z]+)([0-9]+)", 'foofo21', re.I)
if match:
    items = match.groups()
print(items)
>> ("foofo", "21")
于 2009-01-09T23:12:01.137 に答える
53
>>> デフ mysplit:
... ヘッド = s.rstrip('0123456789')
... 尾 = s[len(頭):]
... 頭、尻尾を返す
...
>>> [['foofo21', 'bar432', 'foobar12345'] の s の mysplit(s)]
[('foofo', '21'), ('bar', '432'), ('foobar', '12345')]
>>>
于 2009-01-10T06:17:25.597 に答える
31

さらに別のオプション:

>>> [re.split(r'(\d+)', s) for s in ('foofo21', 'bar432', 'foobar12345')]
[['foofo', '21', ''], ['bar', '432', ''], ['foobar', '12345', '']]
于 2009-01-10T00:54:09.243 に答える
28
>>> r = re.compile("([a-zA-Z]+)([0-9]+)")
>>> m = r.match("foobar12345")
>>> m.group(1)
'foobar'
>>> m.group(2)
'12345'

したがって、その形式の文字列のリストがある場合:

import re
r = re.compile("([a-zA-Z]+)([0-9]+)")
strings = ['foofo21', 'bar432', 'foobar12345']
print [r.match(string).groups() for string in strings]

出力:

[('foofo', '21'), ('bar', '432'), ('foobar', '12345')]
于 2009-01-09T23:12:16.533 に答える
11

findall() =) を持ち出すのはいつも私です。

>>> strings = ['foofo21', 'bar432', 'foobar12345']
>>> [re.findall(r'(\w+?)(\d+)', s)[0] for s in strings]
[('foofo', '21'), ('bar', '432'), ('foobar', '12345')]

以前のほとんどの回答よりも単純な(入力が少ない)正規表現を使用していることに注意してください。

于 2009-01-09T23:40:54.463 に答える
3

正規表現を使用せず、組み込み関数 isdigit() を使用すると、開始部分がテキストで後半部分が数値の場合にのみ機能します

def text_num_split(item):
    for index, letter in enumerate(item, 0):
        if letter.isdigit():
            return [item[:index],item[index:]]

print(text_num_split("foobar12345"))

出力:

['foobar', '12345']
于 2019-04-25T06:27:21.067 に答える
2
import re

s = raw_input()
m = re.match(r"([a-zA-Z]+)([0-9]+)",s)
print m.group(0)
print m.group(1)
print m.group(2)
于 2015-11-19T19:28:53.407 に答える