产品代码看起来像abcd2343,用字母和数字分割的内容

时间:2010-07-27 01:07:17

标签: python split

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

abcd2343 abw34324 abc3243-23A

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

我想分开第一次出现的数字。

6 个答案:

答案 0 :(得分:40)

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

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


re.split(pat, s)将使用s作为分隔符拆分字符串pat。如果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)仅返回与s匹配的pat部分:

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

答案 1 :(得分:1)

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

中一次划一行

答案 2 :(得分:1)

要分配第一个数字

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

所以这两个部分总是部分[0]和部分[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()

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

def firstIntIndex(string):
    result = -1
    for k in range(0, len(string)):
        if (bool(re.match('\d', string[k]))):
            result = k
            break
    return result

答案 5 :(得分:0)

尝试此代码将可以正常工作

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

输出:

['MARIA APARECIDA','99223-2000 / 98450-8026']