如果找不到第二个字符串,在两个字符串之间提取字符串并获取到结尾的模式是什么?例如:检索分配给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'
由于
答案 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']