Сделать код менее сложным и более читабельным

Мне нужно переписать мой простой код. Я получаю простые строки, как показано ниже:

  • Распределить ABC 1-2-х
  • Распределить ABC DEF 1-2-x
  • Распределить ABC DEF GHI 1-2-х

Я получаю.split() все слова после "Distrib" и должен выполнить следующие условия:

  1. Если строка [0] - это текст && строка [1] - как целое число, объедините только эти, чтобы получить результат "ABC/1"

  2. Если строка [0] является текстом && строка [1] является текстовым соединением только их, а затем получить в результате "ABC/DEF"

  3. Если строка [0] - это текст && строка [1] - это текст && строка [2] - это текст, соедините их все и получите в результате: "ABC/DEF/GHI"

Я написал простой код для этого, но мне действительно интересно, как написать его менее сложным и более читабельным;)

import re

def main_execute():
    #input_text = "Distrib ABC 1-2-x"
    #input_text = "Distrib ABC DEF 1-2-x"
    #input_text = "Distrib ABC DEF GHI 1-2-x"

    print(str(input_text))
    load_data = re.search('\s[A-Z]*.[A-Z]*.[A-Z]+ [0-9]', input_text).group()
    print("Pobrany ciąg znaków: " + load_data)

    words_array = load_data.split()

    if re.match('[0-9]', words_array[1]):
        print("Złożony ciąg: "
              + words_array[0]
              + "/"
              + words_array[1])
        elif re.match('[A-Z]', words_array[0]) and re.match('[A-Z]', words_array[1]) and re.match('[0-9]', words_array[2]):
        print("Złożony ciąg: "
              + words_array[0]
              + "/"
              + words_array[1])
    elif re.match('[A-Z]', words_array[0]) and re.match('[A-Z]', words_array[1]) and re.match('[A-Z]', words_array[2]) and re.match('[0-9]', words_array[3]):
        print("Złożony ciąg: "
              + words_array[0]
              + "/"
              + words_array[1]
              + "/"
              + words_array[2])


    if __name__ == "__main__":
        main_execute()

2 ответа

Решение

Это может быть значительно упрощено для

import re

data = """
Distrib ABC 1-2-x
Distrib ABC DEF 1-2-x
Distrib ABC DEF GHI 1-2-x
"""

rx = re.compile(r'Distrib (\w+) (\w+)\s*((?:(?!\d)\w)+)?')

results = ["/".join([n for n in m.groups() if n]) for m in rx.finditer(data)]
print(results)

Который дает

['ABC/1', 'ABC/DEF', 'ABC/DEF/GHI']

Смотрите демонстрацию для выражения на regex101.com.


Другой подход, предложенный @Wiktor, может быть

Distrib (\w+) (\w+)\s*([^\W\d]+)?

Часть [^\W\d]+ говорит: не нет (удвоение не является ошибкой!) слово символов, а не цифры, как можно дольше.

Опираясь на ответ @Jan, вы можете упростить чтение регулярного выражения:

import re

data = """
Distrib ABC 1-2-x
Distrib ABC DEF 1-2-x
Distrib ABC DEF GHI 1-2-x
"""

rx = re.compile(r'Distrib ([A-Z]+) ([A-Z0-9]+) ?([A-Z]*)')

results = ["/".join([n for n in m.groups() if n]) for m in rx.finditer(data)]
print(results)

который дает тот же результат:

['ABC/1', 'ABC/DEF', 'ABC/DEF/GHI']
Другие вопросы по тегам