Кодът на продукта изглежда като abcd2343, какво да се раздели на букви и цифри

Имам списък с продуктови кодове в текстов файл, при всяко харесване е продуктовият код, който изглежда така:

abcd2343 abw34324 abc3243-23A

Така че това са букви, последвани от цифри и други знаци.

Искам да разделя при първото появяване на число.


person Blankman    schedule 27.07.2010    source източник


Отговори (5)


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 или повече нецифри.

Консултирайте се с документите за повече относно синтаксиса на regex на Python.


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']
person unutbu    schedule 27.07.2010
comment
Ако използвате '(\d+)' и цифра е последният символ на низа, последният запис в списъка ще бъде празен низ. Как да избегнем това? - person user124384; 15.10.2016
comment
IIUC, можете да използвате re.findall('(\d+|\D+)', 'abcd2343 abw34324 abc3243-23'), което връща ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23']. - person unutbu; 15.10.2016

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 за групата букви и 3243-23A за the_rest

Тъй като казахте, че всички те са на отделни редове, очевидно ще трябва да поставите ред по ред в input

person jwsample    schedule 27.07.2010

За разделяне на първата цифра

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().

person Muhammad Alkarouri    schedule 27.07.2010

Тази функция обработва също числа с плаваща замък и отрицателни числа.

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']
person Babak Ravandi    schedule 11.08.2020

Опитайте този код, той ще работи добре

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

Изход:

[„МАРИЯ АПАРЕСИДА“, „99223-2000 / 98450-8026“]

person Basant Rules    schedule 14.11.2019