3

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

  • 分发 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. 如果字符串 [0] 是文本 && 字符串 [1] 是文本,则仅加入它们,然后得到结果“ABC/DEF”

  3. 如果 string[0] is text && string[1] is text && string[2] is text 将它们全部连接并得到结果:“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()
4

2 回答 2

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

请参阅regex101.com 上的表达式演示。


@Wiktor 提出的另一种方法可能是

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

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

于 2018-02-12T20:11:40.507 回答
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']
于 2018-02-12T20:40:28.360 回答