Указание правил расщепления строк Python - PullRequest
2 голосов
/ 30 сентября 2019

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

Пример отправки:

sentence = 'SUPER Jumper Colour BROWN-8'

Из этого мне нужно три переменные

textBeforeColour = 'SUPER Jumper Colour'
Colour = 'BROWN'
Size = '8'

PS. цвет (КОРИЧНЕВЫЙ-8) всегда будет в ЗАГЛАВНЫХ знаках. Что угодно, прежде чем цвет (КОРИЧНЕВЫЙ-8) может иметь некоторые слова в КАПС, но не все.

Я создал скрипт, который будет делать именно это, но я знаю, что если текст немного изменится, скрипт сломается. Например

import re
text = 'SUPER Jumper Colour BROWN-8'
list = text.split()
myList = []
lastWord = list[-1]

for iterating_var in list:
   if iterating_var is not list[-1]: #THIS GIVES ME THE 'BEFORE COLOUR' TEXT
        myList.append(iterating_var)

if lastWord == 'SIZE':
     print('ONE SIZE') #This is used when the Size is not a number but comes as ONE SIZE
else:
    splitText = re.split('-',lastWord)
    print(splitText[0])
    print(splitText[1])
    Colour = splitText[0]
    size = splitText[1]

Теперь все это работает. Но если строка будет использовать цвет: LIGHT BLUE - этот скрипт сохранит «LIGHT» с переменной предложения, а не с переменной цвета.

Ответы [ 2 ]

3 голосов
/ 30 сентября 2019

Вы должны быть в состоянии сделать это в одном регулярном выражении с группами захвата:

import re

pat = re.compile(r'^([\w\s]+?)\s+([A-Z\s]+)-(\d+)$')

sentence = 'SUPER Jumper Colour LIGHT BLUE-88'

match = pat.match(sentence)
if match:
    text, color, number = match.groups()
    print(text)    # SUPER Jumper Colour
    print(color)   # LIGHT BLUE
    print(number)  # 88

Регулярные выражения являются мощными, но могут быть сложными. Если вы не знакомы с ними, вот документация для модуля re

3 голосов
/ 30 сентября 2019
import re
text = "blah Blah LIGHT BLUE-8"

if text.split()[-1] == "SIZE":
    print("ONE SIZE")
else:
    colour = re.findall("([A-Z ]+)-[0-9]$", text)[0][1:]
    print(colour)
    size = int(re.findall("[0-9]+$", text)[0])
    print(size)
    sentence = re.findall("(.*[^A-Z ])[A-Z ]+-[0-9]$", text)[0]
    print(sentence)

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

Для размера: нольили более цифр в конце строки

Для предложения: ноль или более символов, затем символ, который не является заглавной буквой или пробелом, затем шаблон для цвета

...