将字符串拆分为两个单独的数字和字母列表-python

时间:2014-04-12 01:22:08

标签: python regex string list

标题类型说明了一切。例如: 我想拆分

stringtosplit = 'hello57world' 

letters = ['h','e','l','l','o','w','o','r','l','d']
numbers = ['5', '7']

然后将它们都重新组成字符串,

letters = 'helloworld'
numbers = '57'

有没有整洁的方法来做到这一点?我想让我的代码尽可能简洁。数字和字母可以出现在字符串和空格中的任何位置,特殊字符已经过滤掉了。

6 个答案:

答案 0 :(得分:1)

通常情况下,您可以这样做:

>>> stringtosplit = 'hello57world'
>>> onlyLetter = "".join([i for i in stringtosplit if i.isalpha()])
>>> onlyLetter
'helloworld'
>>> onlyDig = "".join([i for i in stringtosplit if i.isdigit()])
>>> onlyDig

函数i.isalpha()将测试我是否是一个字母,而i.isdigit()测试我是否是一个数字。

答案 1 :(得分:1)

使用str.joinstr.isalphastr.isdigit和生成器理解:

>>> s = 'hello57world'
>>> alphas = ''.join(c for c in s if c.isalpha())
>>> nums = ''.join(c for c in s if c.isdigit())
>>> print alphas, nums
helloworld 57

答案 2 :(得分:1)

>>> stringtosplit = 'hello57world' 
>>> letters = []
>>> numbers = []
>>> for k in stringtosplit:
...     if k.isalpha() == True:
...         letters.append(k)
...     elif k.isdigit() == True:
...         numbers.append(k)
... 
>>> letters
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
>>> numbers
['5', '7']
>>> letters = ''.join(letters)
>>> numbers = ''.join(numbers)
>>> letters
'helloworld'
>>> numbers
'57'

使用str.isalpha检查变量是否为字母,使用str.isdigit检查变量是否为数字。然后使用''.join(str)list转换为str

答案 3 :(得分:0)

import string

letters = []
numbers = []

for achar in thestring:
    if achar in string.ascii_letters:
        letters.append(achar)
    if achar in string.digits:
        letters.append(achar)

letters_string = "".join(letters)
numbers_string = "".join(numbers)

答案 4 :(得分:0)

使用正则表达式:

import re

stringtosplit = 'hello57world'
letters = ''.join(re.findall('([a-zA-Z])', stringtosplit))
numbers = ''.join(re.findall('([0-9])', stringtosplit))

答案 5 :(得分:0)

工具

  1. 您应该将此Python Regex与组一起使用。我相信这将提供最清理的方式:

    r = r"(?P<first>[a-z]*)(?P<num>[0-9]*)(?P<last>[a-z]*)"
    #           ^^^^^         ^^^^              ^^^
    #    before numbers      numbers        after numbers  
    # any group can be absent
    
  2. 然后您可以使用re.findall(pattern, string, flags=0)

      

    返回字符串中pattern的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;这将是一个元组列表。如果模式有多个组。结果中包含空匹配,除非它们触及另一场比赛的开头。

  3. <强>试验例:

    >>> re.findall(r, 'hello57world')[0]  # your string 
    ('hello', '57', 'world')
    >>> re.findall(r, 'hello57')[0]  # word after number ""
    ('hello', '57', '')
    >>> re.findall(r, '3234abcd')[0] # word before number ""
    ('', '3234', 'abcd')
    >>> re.findall(r, '450')[0]  # only number
    ('', '450', '')
    >>> re.findall(r, 'hello')[0]  # number is ""
    ('hello', '', '')
    >>> re.findall(r, '')[0] # empty string
    ('', '', '')
    

    <强>代码:
    现在您可以用三行编写简单的代码:

    >>> stringtosplit = 'hello57world' 
    >>> r = r"(?P<first>[a-z]*)(?P<num>[0-9]*)(?P<last>[a-z]*)"
    >>> f, n, l = re.findall(r, stringtosplit)[0]
    >>> n
    '57'
    >>> f + l
    'helloworld'
    

    试一试!!