匹配多个字符串

时间:2016-10-02 08:28:59

标签: python regex

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

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

此字符串应将值20分配给Tap,将957分配给Bottles,将139分配给Cans。此字符串不固定且可能不同(例如3个值或0,也可以互换Tap,Bottles或Cans的位置)。

到目前为止,我已经开发了这个:

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语句来调试代码。我的目的只是为适当的变量赋值。

3 个答案:

答案 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 :(得分: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

答案 2 :(得分: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)