Python 提取两个字符串之间的字符串,如果未找到第二个字符串,则提取到末尾

Python 提取两个字符串之间的字符串,如果未找到第二个字符串,则提取到末尾,python,regex,python-2.7,Python,Regex,Python 2.7,如果找不到第二个字符串,提取两个字符串之间的字符串并提取到末尾的模式是什么?例如:检索分配给foo的值(值包含空格) 谢谢您可以将前瞻(?=…)与or逻辑一起使用(下一个和或字符串结尾$): 由于您没有从字符串的开头进行匹配,因此使用re.search可能更方便;如果您只想与下一个和匹配,则非贪婪的*?正则表达式更合适 import re re.search(r'foo=(.*?)(?= and|$)', s1).group(1) # '4, 5, 6' re.search(r'foo=(.*?

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

谢谢

您可以将前瞻(?=…)与or逻辑一起使用(下一个
或字符串结尾
$
):

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

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

正则表达式需要允许使用惰性量词的
字符串结尾。在您的正则表达式中,
*
贪婪的,将尝试匹配最长的字符串,直到字符串结束

以下正则表达式适用于您:

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']

r'^.*foo=(.+?)(?:\sand |$)
将通过进行
可选匹配来工作。您也可以使用
r'foo=((?:(?!和)。*)”
但效率不高。另一个选择是。谢谢阿努巴瓦,这很有效。顺便问一下,为什么要将foo=(.*)更改为foo=(.+?)?Ta@CanLu:这是因为
*
贪婪,会尝试匹配最长的字符串,直到字符串结束。所以
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']