将字母和数字组成的字符串拆分为部分
我有一个字符串,这个字符串里面交替出现小写字母和数字(可以是整数或小数),长度是任意的。我想把它分成几个部分,每个部分尽可能大,确保每个部分要么是字母串,要么是一个数字(数字的字符串形式)。
我不需要考虑特殊的数字形式,比如指数、十六进制等等;只要简单的小数或整数就可以。
这里有几个例子:
>>> 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 个回答
在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这个时候,我们可以去一些技术论坛,比如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.10.2
这可以表示为0.1、0.2,或者0、.10、.2
那如果数字是
27.6734.98呢?
你需要先明确你想要的数字类型和格式。比如:每个数字旁边只能有一个小数位。
这里我们玩了一下 re.sub
和 itertools.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")
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()
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。