输入:'(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
让它运转的任何解决方案(请看空格)?
答案 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>