如果找不到第二个字符串,则在两个字符串之间提取字符串并获取到结尾

时间:2018-05-16 14:06:53

标签: python regex python-2.7

如果找不到第二个字符串,在两个字符串之间提取字符串并获取到结尾的模式是什么?例如:检索分配给foo的值(值包含空格)


import re

s1 = 'quz=1, 2, 3 and foo=4, 5, 6 and bar=7, 8, 9'
m = re.match(pattern=r'^.*foo=(.*)\sand', string=s1)

assert m.group(1) == '4, 5, 6'

s2 = 'quz=1, 2, 3 and foo=4, 5, 6'
m = re.match(pattern=r'^.*foo=(.*)', string=s2)

assert m.group(1) == '4, 5, 6'

由于

2 个答案:

答案 0 :(得分:1)

您可以使用向前看(?= ...)并使用逻辑(下一个and或字符串$的结尾) :

由于您不是从字符串的开头匹配,因此使用re.search可能更方便;如果您只想匹配下一个.*?,那么非贪婪的and正则表达式会更合适;

import re
re.search(r'foo=(.*?)(?= and|$)', s1).group(1)
# '4, 5, 6'
re.search(r'foo=(.*?)(?= and|$)', s2).group(1)
# '4, 5, 6'

答案 1 :(得分:0)

您的正则表达式需要允许and字符串结尾,并且 lazy 量词。在你的正则表达式.*贪婪并尝试匹配最长的字符串直到字符串的结尾。

以下正则表达式适合您:

r'^.*foo=(.*?)(?:\sand|$)'

以下是完整代码:

>>> s1 = 'quz=1, 2, 3 and foo=4, 5, 6 and bar=7, 8, 9'
>>> s2 = 'quz=1, 2, 3 and foo=4, 5, 6'
>>> p = r'^.*foo=(.*?)(?:\sand|$)'

>>> print re.findall(p, s1)
['4, 5, 6']

>>> print re.findall(p, s2)
['4, 5, 6']