Python 提取两个字符串之间的字符串,如果未找到第二个字符串,则提取到末尾
如果找不到第二个字符串,提取两个字符串之间的字符串并提取到末尾的模式是什么?例如:检索分配给foo的值(值包含空格) 谢谢您可以将前瞻(?=…)与or逻辑一起使用(下一个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=(.*?
和
或字符串结尾$
):
由于您没有从字符串的开头进行匹配,因此使用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']