将字符串解析为元组列表

2024-07-08 12:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

输入:'(tagname1, tagvalue1),(tagname2,tagvalue2), ( tagname3, tagvalue3 ), (tag name4,tag value4)'

输出:[("tagname1", "tagvalue1"), ("tagname2", "tagvalue2"), ("tagname3", "tagvalue3"), ("tag name4", "tag value4")]

我有一个解决方案,但是只有当输入包含每个元素的引号时,它才有效:"tagname1", "tagvalue1" ...

import ast
ast.literal_eval(input_string)

我收到:ValueError: malformed string

有什么解决方案可以让它工作(也请看空格)?在


Tags: import元素stringtag解决方案ast引号value4
3条回答

尝试另一种方法,使用正则表达式:

>>> import re
>>> s = '(tagname1, tagvalue1),(tagname2,tagvalue2), ( tagname3, tagvalue3 ), (tag name4,tag value4)'
>>> e = '\(\s?(.*?)\s?,\s?(.*?)\s?\)'
>>> re.findall(e, s)
[('tagname1', 'tagvalue1'), ('tagname2', 'tagvalue2'), ('tagname3', 'tagvalue3'), ('tag name4', 'tag value4')]

Burhan建议的另一种方法是利用反向引用的能力。您可以阅读有关反向引用here的更多信息。在

import re

# Input string
string = '(tagname1, tagvalue1),(tagname2,tagvalue2), ( tagname3, tagvalue3 ), (tag name4,tag value4)'

# Regular expression pattern 
pattern = re.compile(r"\(([a-z0-9 ]+), ?([a-z0-9 ]+)\)", re.I)

list_of_tupples = []
for matched_object in pattern.finditer(string):
    list_of_tupples.append((matched_object.group(1), matched_object.group(2)))

您可以看到正则表达式演示here。在

注意:

我还使用了usepattern.finditter(),因为这样您可以通过文本中的所有模式发现进行迭代。来自芬代尔文件:

re.finditer(pattern, string, flags=0) Return an iterator yielding MatchObject instances over all non-overlapping matches for the RE pattern in string. The string is scanned left-to-right, and matches are returned in the order found. Empty matches are included in the result unless they touch the beginning of another match.

另一种非正则表达式方法:

def string_to_tuples(s):
    def tuple_strip(s):  # Wrapper to pass to map
        return s.strip(" ()")

    sl = map(tuple_strip, s.split(","))
    return zip(sl[::2], sl[1::2])

结果是:

^{pr2}$

只要标记不能以(space), (,或)开头或结尾,并且不包含任何,s,那么它就可以工作

相关问题 更多 >

    热门问题