将字符串解析为元组列表

时间:2017-07-13 07:20:04

标签: python python-2.7

输入:'(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

让它运转的任何解决方案(请看空格)?

4 个答案:

答案 0 :(得分:11)

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

    String IEDriver_64 = "D:/Tools/IEDriverServer.exe";
    System.setProperty("webdriver.ie.driver", IEDriver_64); 
    DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
    capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,
    true); 
    WebDriver driver = new InternetExplorerDriver(capabilities); 
    //capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);


    String baseUrl = "https://xxx//member/login.php";
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.get(baseUrl);
    Thread.sleep(1000*30);
    System.out.print("driver.getCurrentUrl()1="+driver.getCurrentUrl());
    System.out.print("driver.getTitle()1="+driver.getTitle());
    System.out.print("-------------1-------------");
    String currenthandle = driver.getWindowHandle();
    System.out.print("-------------2-------------");
    System.out.print("currenthandle="+currenthandle);
    Thread.sleep(1000*5);
    driver.findElement(By.id("SUBMIT_LOGIN")).click();

答案 1 :(得分:1)

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

注意:

我还使用了pattern.finditter(),因为这样你可以通过文本迭代所有模式发现。来自 re.finditer 文档:

  

re.finditer(pattern,string,flags = 0)返回一个迭代器让步   RE的所有非重叠匹配上的MatchObject实例   字符串中的模式。字符串从左向右扫描,并匹配   按找到的顺序返回。空匹配包含在   结果,除非他们触及另一场比赛的开始。

答案 2 :(得分:1)

这是一个re.findall变体,可以处理多个空格(非单词字符):

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

注意单词字符(包括空格)[\w\s]*?后面的非贪婪闭包(重复限定符)。这样可以确保捕获每个标记名称/值的所有单词,但排除所有前导和尾随空格。这就是上面正确捕获"tag value4"的原因。

答案 3 :(得分:1)

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

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

哪个收益率:

>>> string_to_tuples('(tagname1, tagvalue1),(tagname2,tagvalue2), ( tagname3, tagvalue3 ), (tag name4,tag value4)')
[('tagname1', 'tagvalue1'), ('tagname2', 'tagvalue2'), ('tagname3', 'tagvalue3'), ('tag name4', 'tag value4')]

并且只要标记无法以(空格),()开头或结尾,并且不包含任何,,就会有效。< / p>