使代码更简单,更易读

时间:2018-02-12 19:51:25

标签: python regex string code-complexity

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

  • Distrib ABC 1-2-x
  • Distrib ABC DEF 1-2-x
  • Distrib ABC DEF GHI 1-2-x

我在“Distrib”之后找到.split()所有单词,我必须满足以下条件:

  1. 如果字符串[0]是文字&& string [1]是整数,然后只加入这些以获得结果“ABC / 1”

  2. 如果字符串[0]是文字&& string [1]只是文本连接,然后得到结果“ABC / DEF”

  3. 如果字符串[0]是文字&& string [1]是text&& string [2]是文本连接所有并得到结果:“ABC / DEF / GHI”

  4. 我写了一个简单的代码来做这个,但我真的很感兴趣如何写它不那么复杂和可读;)

    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 个答案:

答案 0 :(得分:4)

这可以大大简化为

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

答案 1 :(得分: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']