Имам списък с продуктови кодове в текстов файл, при всяко харесване е продуктовият код, който изглежда така:
abcd2343 abw34324 abc3243-23A
Така че това са букви, последвани от цифри и други знаци.
Искам да разделя при първото появяване на число.
Имам списък с продуктови кодове в текстов файл, при всяко харесване е продуктовият код, който изглежда така:
abcd2343 abw34324 abc3243-23A
Така че това са букви, последвани от цифри и други знаци.
Искам да разделя при първото появяване на число.
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']
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
За разделяне на първата цифра
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()
.
Тази функция обработва също числа с плаваща замък и отрицателни числа.
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
text = "MARIA APARECIDA 99223-2000 / 98450-8026"
parts = re.split(r' (?=\d)',text, 1)
print(parts)
Изход:
[„МАРИЯ АПАРЕСИДА“, „99223-2000 / 98450-8026“]