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

Product code looks like abcd2343, how to split by letters and numbers?

提问人:Blankman 提问时间:7/27/2010 最后编辑:TomerikooBlankman 更新时间:12/29/2021 访问量:95997

问:

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

ABC2343 ABW34324 ABC3243-23A系列

所以它是字母,后跟数字和其他字符

我想在第一次出现数字进行拆分

Python 字符串 拆分

评论


答:

94赞 unutbu 7/27/2010 #1
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+匹配 1 位或更多位数字。
  • \d*\D+匹配 0 位或更多位数字,后跟 1 位或更多非位数字。
  • \d+|\D+匹配 1 位或更多位数字或 1 位更多非位数字。

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


re.split(pat, s)将拆分字符串用作分隔符。如果以括号开头和结尾(以便成为“捕获组”),则将返回匹配的子字符串。例如,比较:spatpatre.splitpat

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)spat

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

因此,如果以数字结尾,则可以避免以空字符串结尾,方法是使用而不是:sre.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']

评论

4赞 user124384 10/16/2016
如果使用“(\d+)”,并且数字是字符串的最后一个字符,则列表中的最后一个条目将为空字符串。我们如何避免这种情况?
3赞 unutbu 10/16/2016
IIUC,您可以使用 ,它返回 .re.findall('(\d+|\D+)', 'abcd2343 abw34324 abc3243-23')['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23']
0赞 Baobab 3/18/2022
您好,如何将其应用于整个列?我的列“Product”的格式为“-8937ADF”,我想在同一数据帧中创建两列,分别包含“-8937”和“ADF”。
1赞 Mike 7/27/2010 #2
def firstIntIndex(string):
    result = -1
    for k in range(0, len(string)):
        if (bool(re.match('\d', string[k]))):
            result = k
            break
    return result
2赞 jwsample 7/27/2010 #3
import re

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

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

这涵盖了 abc3243-23A 的极端情况,并将输出字母组和 3243-23A 的abcthe_rest

既然你说它们都在单独的行上,你显然需要一次放一行input

1赞 Muhammad Alkarouri 7/27/2010 #4

对第一位数字进行分区

parts = re.split('(\d.*)','abcd2343')      # => ['abcd', '2343', '']
parts = re.split('(\d.*)','abc3243-23A')   # => ['abc', '3243-23A', '']

所以这两个部分始终是 parts[0] 和 parts[1]。

当然,您可以将其应用于多个代码:

>>> s = "abcd2343 abw34324 abc3243-23A"
>>> results = [re.split('(\d.*)', pcode) for pcode in s.split(' ')]
>>> results
[['abcd', '2343', ''], ['abw', '34324', ''], ['abc', '3243-23A', '']]

如果每个代码都在单独的行中,则使用 .s.split( )s.splitlines()

1赞 Basant Rules 11/14/2019 #5

试试这段代码,它会正常工作

import re
text = "MARIA APARECIDA 99223-2000 / 98450-8026"
parts = re.split(r' (?=\d)',text, 1)
print(parts)

输出:

['玛丽亚·阿帕雷西达', '99223-2000 / 98450-8026']

9赞 Babak Ravandi 8/12/2020 #6

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

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']