产品代码像abcd2343,如何按字母和数字分割?

61 投票
6 回答
99048 浏览
提问于 2025-04-16 01:52

我有一个文本文件,里面有一列产品代码,每一行都是一个产品代码,格式像这样:

abcd2343 abw34324 abc3243-23A

这些代码是由字母数字其他字符组成的。

我想要在第一个数字出现的地方把它们分开

6 个回答

2
import re

m = re.match(r"(?P<letters>[a-zA-Z]+)(?P<the_rest>.+)$",input)

m.group('letters')
m.group('the_rest')

这段话讲的是一个特殊情况,比如说有个字符串是abc3243-23A,它会把字母部分提取出来,结果是abc,而数字和其他部分会被提取成the_rest,结果是3243-23A。

因为你提到每个字符串都在单独的一行,所以你需要把每一行的内容放到input里去处理。

9

这个函数也能处理小数和负数。

def separate_number_chars(s):
    res = re.split('([-+]?\d+\.\d+)|([-+]?\d+)', s.strip())
    res_f = [r.strip() for r in res if r is not None and r.strip() != '']
    return res_f

比如说:

utils.separate_number_chars('-12.1grams')
> ['-12.1', 'grams']
96
import re
s='abcd2343 abw34324 abc3243-23A'
re.split('(\d+)',s)

> ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A']

或者,如果你想在第一个数字出现的地方进行分割:

re.findall('\d*\D+',s)
> ['abcd', '2343 abw', '34324 abc', '3243-', '23A']

  • \d+ 匹配一个或多个数字。
  • \d*\D+ 匹配零个或多个数字,后面跟着一个或多个非数字。
  • \d+|\D+ 匹配一个或多个数字 或者 一个或多个非数字。

想了解更多关于Python正则表达式的语法,可以查看 官方文档


re.split(pat, s) 会用 pat 作为分隔符来分割字符串 s。如果 pat 以括号开头和结尾(这样就形成了一个“捕获组”),那么 re.split 还会返回与 pat 匹配的子字符串。例如,比较一下:

re.split('\d+', s)
> ['abcd', ' abw', ' abc', '-', 'A']   # <-- just the non-matching parts

re.split('(\d+)', s)
> ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A']  # <-- both the non-matching parts and the captured groups

相比之下,re.findall(pat, s) 只会返回与 pat 匹配的 s 的部分:

re.findall('\d+', s)
> ['2343', '34324', '3243', '23']

因此,如果 s 以数字结尾,你可以使用 re.findall('\d+|\D+', s) 来避免以空字符串结束,而不是使用 re.split('(\d+)', s)

s='abcd2343 abw34324 abc3243-23A 123'

re.split('(\d+)', s)
> ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123', '']

re.findall('\d+|\D+', s)
> ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123']

撰写回答