使代码更简单易读

2024-05-19 21:14:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要重写我的简单代码。我得到如下简单字符串:

  • 发行版ABC 1-2-x
  • 发行版ABC DEF 1-2-x
  • 发行版ABC DEF GHI 1-2-x

我将使用.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()

Tags: and字符串text文本reciinputdef
2条回答

在@Jan的答案的基础上,您可以使regex更易于阅读:

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']

这可以大大简化为

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']

请参见表达式on regex101.com的演示。


@Wiktor提出的另一种方法是
Distrib (\w+) (\w+)\s*([^\W\d]+)?

部分[^\W\d]+是说:不是不是(加倍是没有错误的!)单词字符,而不是数字,尽可能长。你知道吗

相关问题 更多 >