簡體   English   中英

使代碼更簡單,更易讀

[英]Make code less complex and more readable

我需要重寫我的簡單代碼。 我得到如下簡單的字符串:

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

我在“Distrib”之后找到.split()所有單詞,我要滿足以下條件:

  1. 如果string [0]是text && string [1]是整數,那么只加入這些以得到結果“ABC / 1”

  2. 如果string [0]是text && string [1],則文本僅加入它們然后得到結果“ABC / DEF”

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

這可以大大簡化為

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM