web-dev-qa-db-ja.com

文字列をテキストと数字に分割する方法は?

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

'foofo21'
'bar432'
'foobar12345'

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

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

44
domruf

次の方法でre.matchを使用してこれにアプローチします。

match = re.match(r"([a-z]+)([0-9]+)", 'foofo21', re.I)
if match:
    items = match.groups()
    # items is ("foo", "21")
51
Evan Fosmark
 >>> def mysplit(s):
 ... head = s.rstrip( '0123456789')
 ... tail = s [len(head):] [。 
 [( 'foofo'、 '21')、( 'bar'、 '432')、( 'foobar'、 '12345')] 
 >>> 
28
Mike
>>> 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')]
21

さらに別のオプション:

>>> [re.split(r'(\d+)', s) for s in ('foofo21', 'bar432', 'foobar12345')]
[['foofo', '21', ''], ['bar', '432', ''], ['foobar', '12345', '']]
17
jfs

私は常にfindall()=)を呼び出します

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

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

9
PEZ

これは、任意の長さの文字列から複数の単語と数字を分離する単純な関数です。reメソッドは、最初の2つの単語と数字のみを分離します。これは将来的に他のすべての人に役立つと思います。

def seperate_string_number(string):
    previous_character = string[0]
    groups = []
    newword = string[0]
    for x, i in enumerate(string[1:]):
        if i.isalpha() and previous_character.isalpha():
            newword += i
        Elif i.isnumeric() and previous_character.isnumeric():
            newword += i
        else:
            groups.append(newword)
            newword = i

        previous_character = i

        if x == len(string) - 2:
            groups.append(newword)
            newword = ''
    return groups

print(seperate_string_number('10in20ft10400bg'))
# outputs : ['10', 'in', '20', 'ft', '10400', 'bg'] 
1
Bryo Much

正規表現を使用せずに、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']
1
roshandev
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)
1
Bug Hunter 219