我有字符串
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'的数量也不固定。
有没有简单的正则表达式方法可以解决此问题?
答案 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
,:
除外)。
[kK]\d+.(.*?)(?=.[kK]\d+|$)
[kK]\d+.
字符串以k1:
或K1:
或k23:
开头(.*?)
全部匹配(?=.[kK]\d+|$)
字符串以整个字符串或K1 k1
[^,]+
拆分字符串完整代码
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']]