2016-10-02 160 views
1

我正在学习Python字符串操作并试图将分隔文本转换为变量。匹配多个字符串

"On Tap: 20 | Bottles: 957 | Cans: 139"

此字符串应分配20的值,以抽头957到瓶,和139到罐。该字符串不固定,可能会有所不同(例如,3个值或0,Tap,Bottles或Can的位置也可以互换)。但是它不工作按我的预期,并重新分配瓶的每一次价值

import re 

strEx = "On Tap: 20 | Bottles: 957 | Cans: 139" 
barServingText = strEx.split('|') 
print(barServingText) 
for i in barServingText: 
    print (i) 
    if i.find("Bottles"): 
     print("Found Bottles") 
     Bottles = re.sub('[^0-9]*','',i) 
     print(Bottles) 
    elif i.find("Cans"): 
     print("Found Cans") 
     Cans = re.sub('[^0-9]*','',i) 
     print(Cans) 
    elif i.find("Tap"): 
     print("Found Tap") 
     Tap = re.sub('[^0-9]*','',i) 
     print(Tap) 

到目前为止,我已经开发了这一点。

输出:

['On Tap: 20 ', ' Bottles: 957 ', ' Cans: 139'] 
On Tap: 20 
Found Bottles 
20 
Bottles: 957 
Found Bottles 
957 
Cans: 139 
Found Bottles 
139 

我已经包含了很多print语句调试代码。我的目的只是为适当的变量赋值。

+0

正如你正在尝试学习python并试图将字符串转换为变量,因此你的变量应该从字符串自动创建,而不是通过将匹配值赋值给你所渲染的变量。应该使用exec(就学习python而言) –

+0

你能举个例子吗? –

+0

看我的答案,我已经发布在这里 –

回答

3

find回报-1时,它无法找到字符串,-1被视为Truebool(-1)True),所以你必须使用find(...) != -1

import re 

strEx = "On Tap: 20 | Bottles: 957 | Cans: 139" 
barServingText = strEx.split('|') 
print(barServingText) 
for i in barServingText: 
    print (i) 
    if i.find("Bottles") != -1: 
     print("Found Bottles") 
     Bottles = re.sub('[^0-9]*','',i) 
     print(Bottles) 
    elif i.find("Cans") != -1: 
     print("Found Cans") 
     Cans = re.sub('[^0-9]*','',i) 
     print(Cans) 
    elif i.find("Tap") != -1: 
     print("Found Tap") 
     Tap = re.sub('[^0-9]*','',i) 
     print(Tap) 

BTW:与您的数据你不需要re。您可以使用split(和strip

Bottles = i.split(':')[1].strip() 

Cans = i.split(':')[1].strip() 

Tap = i.split(':')[1].strip() 
1

str.find()方法用于在一个字符串返回文本的位置。如果找不到文本,则返回整数-1。在Python中,以检查是否在字符串中包含另一个,你可能需要使用的语法if subString in string:,就像这样:

... 
    if "Bottles" in i: 
     print("Found Bottles") 
... 

随着官方文档状态:

对于字符串和字节类型,x in y 只有当且仅当xy的子串时才是如此。等效试验y.find(x) != -1

因此,根据您的首选编码风格和/或特殊需要,可以在“x in y”之间进行选择或“y.find(x) != -1

1

以下的正则表达式应该为您创建键值对:

r"((.*?):(.*?)(\||$))" 

下面的办法,但是我觉得更适合,因为这将使其动态的,可以有比这3个变量更多

import re 

regex = ur"((.*?):(.*?)(\||$))" 

test_str = u"On Tap: 20 | Bottles: 957 | Cans: 139" 

matches = re.finditer(regex, test_str) 

for matchNum, match in enumerate(matches): 
    s=match.group(2).strip().split(' ')[-1]+"="+match.group(3).strip() 
    print(s) 
    exec(s) 

print(Tap) 
print(Bottles) 
print(Cans) 
+0

我觉得这有点完全重写OP的代码,而他只是想弄明白为什么他的代码不能按预期工作。 –

+0

@Ben Morris声明说:“这个字符串不是固定的,可能会有所不同(例如,3个值或0值也可以互换龙头,瓶子或罐头的位置)。”那么用硬编码方法迭代事情会是一个好的例子吗?可以使用exec(“%s =%d”%(x,2))将组3的值分配给组2,并动态地进行一些剥离和投射。我的意图是提出更好的方法...因此,我觉得尝试的方法是不正确的 –