Py学习  »  Python

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

rahul • 6 年前 • 1615 次点击  

我有绳子

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'的数目也不是固定的。

有什么简单的regex方法来解决这个问题吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40165
文章 [ 3 ]  |  最新文章 6 年前
kcorlidy
Reply   •   1 楼
kcorlidy    6 年前

我考虑是否可以提取包含空格或其他内容的值(除了 \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']]
Vasilis G.
Reply   •   2 楼
Vasilis G.    6 年前

您不必使用regex来实现这一点。您只需要根据 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']]
Erika Dsouza
Reply   •   3 楼
Erika Dsouza    6 年前

最简单的方法是使用regex并在单词上进行拆分。

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)