【问题标题】:Make code less complex and more readable使代码更简单,更易读
【发布时间】:2018-07-23 02:14:58
【问题描述】:

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

  • 分发 ABC 1-2-x
  • 分发 ABC DEF 1-2-x
  • 分发 ABC DEF GHI 1-2-x

我要 .split() "Distrib" 之后的所有单词,并且我必须满足以下条件:

  1. 如果 string[0] 为文本 && string[1] 为整数,则仅将这些连接以获得结果“ABC/1”

  2. 如果 string[0] 是文本 && string[1] 是文本,则只加入它们,然后得到结果“ABC/DEF”

  3. 如果 string[0] 是文本 && string[1] 是文本 && string[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()

【问题讨论】:

标签: python regex string code-complexity


【解决方案1】:

这可以大大简化为

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]+ 部分在说:不是不(加倍没有错!)字字符,而不是数字,尽可能长。

【讨论】:

  • 太棒了!谢谢你:)
  • 你可以进一步简化为r'Distrib (\w+) (\w+)\s*([^\W\d]+)?'
【解决方案2】:

基于@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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    相关资源
    最近更新 更多