将字母和数字组成的字符串拆分为部分

5 投票
4 回答
2315 浏览
提问于 2025-04-18 01:20

我有一个字符串,这个字符串里面交替出现小写字母和数字(可以是整数或小数),长度是任意的。我想把它分成几个部分,每个部分尽可能大,确保每个部分要么是字母串,要么是一个数字(数字的字符串形式)。

我不需要考虑特殊的数字形式,比如指数、十六进制等等;只要简单的小数或整数就可以。

这里有几个例子:

>>> split("")
()
>>> split("p")
('p',)
>>> split("2")
('2',)
>>> split("a2b3")
('a', '2', 'b', '3')
>>> split("a2.1b3")
('a', '2.1', 'b', '3')
>>> split("a.1b3")
('a', '.1', 'b', '3')

不过,下面这些调用应该会引发一些错误:

>>> split(3)
>>> split("a0.10.2")
>>> split("ab.c")

我第一次尝试使用 re.split。但是,这个尝试有点天真,它没有保留分隔符,如果我把这些字母变成了:

>>> re.split("[a-z]", "a.1b3")
['', '.1', '3']

我第二次尝试使用 itertools.groupby。问题是它不关心数字的形式,所以,比如说:

>>> islowalpha = labmda s: str.isalpha(s) and str.islower(s)
>>> [''.join(g) for _, g in itertools.groupby("a0.10.2b", islowalpha)]  # should raise
['a', '0.10.2', 'b']

注意:我不在乎输出的形式,只要它是可迭代的就行。

注意:我看过 这个,但我无法将解决方案调整到我的问题上。主要的区别是我只想允许可接受的数字,而不是简单的数字和小数点的列表。

4 个回答

-1

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这个时候,我们可以去一些技术论坛,比如StackOverflow,寻求帮助。在这些论坛上,很多人会分享他们的经验和解决方案。

通常,提问的人会描述他们遇到的问题,包括他们的代码、错误信息以及他们尝试过的解决方法。其他人则会根据这些信息,给出建议或者解决方案。

在这个过程中,大家会使用一些特定的术语和表达方式,但对于初学者来说,理解这些内容可能会有点困难。因此,重要的是要耐心阅读,逐步理解每个细节。

总之,技术论坛是一个很好的学习和交流的平台,能够帮助我们解决编程中的各种问题。

import re

string = 'a.2b3c4.5d'

REG_STR = r'([a-zA-Z])|(\.\d+)|(\d+\.\d+)|(\d+)'
matches = [m.group() for m in re.finditer(REG_STR, string) if re.finditer(REG_STR, string)]
0

问题在于,你提问的前提是有道理的。你怎么能从一个随意的字符串中区分出浮点数呢?其实有很多种解释方式。比如说,
0.10.2 这可以表示为0.1、0.2,或者0、.10、.2
那如果数字是 27.6734.98呢? 你需要先明确你想要的数字类型和格式。比如:每个数字旁边只能有一个小数位。

1

这里我们玩了一下 re.subitertools.cycle 的组合:

def split(s):
    res = []

    def replace(matchobj):
        res.append(matchobj.group(0))
        return ''

    letter = re.compile('^([a-z]+)')
    number = re.compile('^(\.\d|\d+\.\d+|\d+)')

    if letter.match(s):
        c = itertools.cycle([letter, number])
    else:
        c = itertools.cycle([number, letter])

    for op in c:
        mods = op.sub(replace, s)
        if len(s) == len(mods):
            return
        elif not mods:
            return res
        s = mods

基本的想法是创建两个交替的 re 模式,然后尝试用它们来匹配输入的字符串。

下面是一些你提供的例子的演示:

>>> split("2")
['2']
>>> split("a2b3")
['a', '2', 'b', '3']
>>> split("a.1b3")
['a', '.1', 'b', '3']
>>> split("a0.10.2")
>>> split("ab.c")
4
import re

def split_gen(x):
    for f, s in re.findall(r'([\d.]+)|([^\d.]+)', x):
        if f:
            float(f)
            yield f
        else:
            yield s

def split(x):
    '''
    >>> split("")
    ()
    >>> split("p")
    ('p',)
    >>> split("2")
    ('2',)
    >>> split("a2b3")
    ('a', '2', 'b', '3')
    >>> split("a2.1b3")
    ('a', '2.1', 'b', '3')
    >>> split("a.1b3")
    ('a', '.1', 'b', '3')
    >>> split(3)
    Traceback (most recent call last):
    ...
    TypeError: expected string or buffer
    >>> split("a0.10.2")
    Traceback (most recent call last):
    ...
    ValueError: could not convert string to float: '0.10.2'
    >>> split("ab.c")    
    Traceback (most recent call last):
    ...
    ValueError: could not convert string to float: '.'
    '''
    return tuple(split_gen(x))

if __name__ == '__main__':
    import doctest
    doctest.testmod()

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答