在字符串python中的特定关键字之后提取列表

时间:2018-11-26 20:19:18

标签: python regex python-3.x

我有字符串

my_string = "K1:s1,\ns2,\ns3,\n\nK2:g1,\ng2,\ng3,\nK3:m1,\nm2,\nm3"

my_string的简化视图:

"K1:s1,
 s2,
 s3,

 K2:g1,
 g2,
 g3,    
 K3:m1,
 m2,
 m3"

我需要寻找关键字K1:,K2:,K3:并提取列表中另一个关键字之后和之前的所有内容。 例如:

List1 = [s1, s2, s3]
List2 = [g1, g2, g3]
List3 = [m1, m2, m3]

字符串中关键字的顺序不固定。 K1:可以排在K2:和K3:之后,反之亦然。换行符'\ n'的数量也不固定。

有没有简单的正则表达式方法可以解决此问题?

3 个答案:

答案 0 :(得分:0)

最简单的方法是使用正则表达式并分割单词。

result = []
for word in re.split('\W+', my_string):
    if word.startswith('K'):
        if result:
            print result
        result = []
    else:
        result.append(word)

if result:
    print(result)

答案 1 :(得分:0)

您不必使用正则表达式来执行此操作。您需要做的就是根据K值重新格式化输入字符串并对其进行排序:

my_string = "K1:s1,\ns2,\ns3,\n\nK2:g1,\ng2,\ng3,\nK3:m1,\nm2,\nm3"
# Reformat and sort results.
my_string = sorted("".join(my_string.split()).replace(",K","\nK").split('\n'), key=lambda elem: int(elem[1]))
# Get results.
resultList = [elem[3:].split(',') for elem in my_string]
# Print results.
print(resultList)

输出:

[['s1', 's2', 's3'], ['g1', 'g2', 'g3'], ['m1', 'm2', 'm3']]

答案 2 :(得分:0)

我考虑是否可以提取包含空格或其他内容的值(\n:除外)。

  1. [kK]\d+.(.*?)(?=.[kK]\d+|$)
    • [kK]\d+.字符串以k1:K1:k23:开头
    • (.*?)全部匹配
    • (?=.[kK]\d+|$)字符串以整个字符串或K1 k1
    • 的结尾
  2. [^,]+拆分字符串

完整代码

import re

my_string = "K1:s1,\ns: face2,\ns3,\n\nK2:g1,\ng2,\ng3,\nK3:m1,\nm2,\nm3"
my_string = my_string.replace("\n","") # remove \n

string_list = re.findall(r"[kK]\d+.(.*?)(?=.[kK]\d+|$)",my_string,re.DOTALL)
group = [ re.findall(r"[^,]+",ele) for ele in string_list]
print(group)

# [['s1', 's: face2', 's3'], ['g1', 'g2', 'g3'], ['m1', 'm2', 'm3']]