Отделение чисел, специальных символов и знака или — от строки в python

python #character #data-cleaning

#python #символ #очистка данных

Вопрос:

Итак, у меня есть строки, подобные

a = ';1'

b = '2 3'

c = '32'

d = '12-'

e = '2 ;'

f = '2'

Я хочу разделить их, чтобы получить следующие результаты:

a: [';', '1']

b: ['2 ', '3']

c: ['3', '2']

d: ['1', '2-']

e: ['2 ', ';']

`f: [‘2’, Нет]

Знак или — всегда идет после цифры.

Комментарии:

1. А как насчет 2;3 ?

2. Такого экземпляра не существует.

3. вы делаете list(b) ?

4. Я это сделал. Но мне нужно 2 и вместе, например, «2 » в b, а затем 3 разделенных.

5. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Ответ №1:

Вы можете сделать что-то в этом роде, это отлично работает для всех предоставленных вами входных данных. Не самый питонический способ сделать это, но он работает.

 a = ';1'
b = '2 3'
c = '32'
d = '12-'
e = '2 ;'

inputs = [a, b, c, d, e]
output = list()
for expr in inputs:
    i = 0
    string = str()
    li = list()
    while (i < len(expr)):
        if (expr[i] >= '0' and expr[i] <= '9') and i < len(expr) - 1:
            if expr[i   1] == ' ' or expr[i   1] == '-':
                string  = expr[i]
                string  = expr[i   1]
                li.append(string)
                i  = 1
            else:
                li.append(expr[i])
        else:
            li.append(expr[i])
        i  = 1
    output.append(li)

print(output)
 

Ответ №2:

Использование pairwise() и chain() из встроенного модуля itertools:

 # itertools.pairwise is available on python 3.10 , use this function on earlier versions
# copied from https://docs.python.org/3/library/itertools.html#itertools.pairwise
def pairwise(iterable):
    # pairwise('ABCDEFG') --> AB BC CD DE EF FG
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

def split(s: str) -> typing.List[str]:
    # iterate pairwise: "2 3" --> [("2", " "), (" ", "3"), ("3", None)]
    # the None is just added to get the last number right
    pairs = pairwise(chain(s, [None]))
    output = []
    for l in pairs:
        if l[1] and l[1] in " -":
            # number is followed by a " " or "-" --> join together
            output.append("".join(l))
        elif l[0] not in " -":
            # number is not followed by  /-, append the number
            output.append(l[0])
    return output

# checking your examples:
strings = [';1', '2 3', '32', '12-', '2 ;']
[split(s) for s in strings]
# [[';', '1'], ['2 ', '3'], ['3', '2'], ['1', '2-'], ['2 ', ';']]

# bonus: everything in one line because why not
[[("".join(l) if l[1] and l[1] in " -" else l[0]) for l in pairwise(chain(s, [None])) if l[0] not in " -"] for s in strings]
# [[';', '1'], ['2 ', '3'], ['3', '2'], ['1', '2-'], ['2 ', ';']]