如何将字符串拆分为文本和数字?

dom*_*ruf 48 python string split

我想分割这些字符串

'foofo21'
'bar432'
'foobar12345'
Run Code Online (Sandbox Code Playgroud)

['foofo', '21']
['bar', '432']
['foobar', '12345']
Run Code Online (Sandbox Code Playgroud)

有人知道在python中执行此操作的简单方法吗?

Eva*_*ark 54

我会通过re.match以下方式使用它来解决这个问题:

match = re.match(r"([a-z]+)([0-9]+)", 'foofo21', re.I)
if match:
    items = match.groups()
    # items is ("foo", "21")
Run Code Online (Sandbox Code Playgroud)

  • @Dan:使用\ w是一个糟糕的选择,因为它匹配所有字母数字字符,而不仅仅是az.因此,整个字符串将被捕获在第一组中. (5认同)
  • `re.split('(\d+)', t)` (3认同)
  • 如果这是一个问题,你可以在最后添加'\ b'(IIRC),指定匹配必须以字边界结束(或'$'匹配字符串的结尾). (2认同)
  • 如何将其扩展到 str-digit-str-digit 例如 p6max20 以获得 p=6, max=20?“( )( )( )( )”四组? (2认同)

小智 30

>>> def mysplit(s):
...     head = s.rstrip('0123456789')
...     tail = s[len(head):]
...     return head, tail
... 
>>> [mysplit(s) for s in ['foofo21', 'bar432', 'foobar12345']]
[('foofo', '21'), ('bar', '432'), ('foobar', '12345')]
>>> 

  • 在我的机器上,使用一个示例(案例研究,不能代表所有用途)将此答案与[接受的答案](/sf/answers/30107171/)的时间进行比较。 ).trip()方法的速度大约快了4倍。此外,它不需要其他导入。 (2认同)

Fed*_*oni 21

>>> r = re.compile("([a-zA-Z]+)([0-9]+)")
>>> m = r.match("foobar12345")
>>> m.group(1)
'foobar'
>>> m.group(2)
'12345'
Run Code Online (Sandbox Code Playgroud)

因此,如果您有一个具有该格式的字符串列表:

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

输出:

[('foofo', '21'), ('bar', '432'), ('foobar', '12345')]
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 20

另一种选择:

>>> [re.split(r'(\d+)', s) for s in ('foofo21', 'bar432', 'foobar12345')]
[['foofo', '21', ''], ['bar', '432', ''], ['foobar', '12345', '']]
Run Code Online (Sandbox Code Playgroud)


PEZ*_*PEZ 9

我总是那个提起findall()=)的人

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

请注意,我使用比以前大多数答案更简单(更少类型)的正则表达式.

  • @PEZ:如果你允许除数字之外的任何文本,那么你的正则表达式应该是r'(\ D +)(\ d +)'. (3认同)

小智 6

这是一个从任意长度的字符串中分离多个单词和数字的简单函数,re 方法只分离前两个单词和数字。我认为这将有助于未来的所有人,

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'] 
Run Code Online (Sandbox Code Playgroud)