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

2024-10-01 15:28:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个文本文件中有一个产品代码列表,每一行上都有产品代码,如下所示:

abcd2343 abw34324 abc3243-23A

因此它是字母,然后是数字其他字符

我想在一个数字的第一次出现时拆分


Tags: 代码列表产品字母数字字符文本文件abw34324
3条回答

此函数还处理浮点数和负数

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']
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中一次放一行

In [32]: import re

In [33]: s='abcd2343 abw34324 abc3243-23A'

In [34]: re.split('(\d+)',s)
Out[34]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A']

或者,如果要在第一次出现数字时分割:

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

  • \d+匹配一个或多个数字
  • \d*\D+匹配0个或多个数字,后跟1个或多个非数字
  • \d+|\D+匹配1个或多个数字1个或多个非数字

有关Python正则表达式语法的更多信息,请参阅the docs


re.split(pat, s)将使用pat作为分隔符拆分字符串s。如果pat以括号开始和结束(以便成为“捕获组”),那么re.split也将返回与pat匹配的子字符串。例如,比较:

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

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

相反,re.findall(pat, s)只返回与pat匹配的s部分:

In [115]: re.findall('\d+', s)
Out[115]: ['2343', '34324', '3243', '23']

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

In [118]: s='abcd2343 abw34324 abc3243-23A 123'

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

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

相关问题 更多 >

    热门问题