Строка Python разбивается только на числа, перед которыми стоит пробел - PullRequest
0 голосов
/ 01 мая 2019

У меня есть следующая строка, которую я хотел бы разделить на список.Я пытаюсь выяснить, как разбить его на цифры, перед которыми стоит пробел.

Я попробовал следующее, и это почти то, что мне нужно.

\s+(?=\d)|(?<=\d)\s+

Попытка

import re

# Find the numeric values: 
tmplist = re.split(r'\s+(?=\d)|(?<=\d)\s+', 'Dual 425mm AutoCannon 25') 


# Print the list
print(tmplist)

Это результат:

['Dual', '425mm AutoCannon', '25']

Это желаемый результат:

['Dual 425mm AutoCannon', '25']

Ответы [ 2 ]

5 голосов
/ 01 мая 2019

Один из вариантов может заключаться в том, чтобы соответствовать пробелу и использовать положительный прогноз, чтобы утверждать, что справа находятся 1+ цифры, после которых не следует символ без пробела:

\s(?=\d+(?!\S))
  • \s Символ пробела
  • (?= положительный взгляд, утверждай, что прямо справа
    • \d+ Совпадение 1+ цифр
    • (?! Отрицательный взгляд вперед, утверждай, что прямо справа нет
      • \S Соответствует непробельному символу
    • ) Закрыть негативный взгляд
  • Закрыть позитивный взгляд

Regex demo | Python demo

Ваш код может выглядеть так:

import re
tmplist = re.split(r'\s(?=\d+(?!\S))', 'Dual 425mm AutoCannon 25') 
print(tmplist)

Результат

['Dual 425mm AutoCannon', '25']

См. Regulex Visual

enter image description here

0 голосов
/ 01 мая 2019

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

def split_on_number(text):

    final = [text.split()[0]]  # Autoload the first item
    for i in text.split()[1:]: # Ignore the first item

        try:
            #Try to convert it to a float
            float(i)           

        except ValueError: 
            # if there's an issue, append to last item
            final[-1] = " ".join([final[-1], i]) 

        else:
            # if you can covnert to a float, then append it
            final.append(i)    

    return final

print(split_on_number('Dual 425mm AutoCannon 25 with another 4 items'))
# ['Dual 425mm AutoCannon', '25 with another', '4 items']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...