Python: 重复查找两个字符串之间的一个字符串

6

我刚接触Python,还在学习正则表达式,所以这个问题对一些正则表达式专家来说可能很简单,但是请听我细细道来。我想我的问题是以下问题的一个普遍扩展 这个问题是关于在两个字符串之间查找一个字符串。我想知道:如果在一个长字符串中多次重复出现此模式(初始子串+要查找的子串+结束子串)会怎样呢? 例如:

test='someth1 var="this" someth2 var="that" '
result= re.search('var=(.*) ', test)
print result.group(1)
>>> "this" someth2 var="that"

相反,我想要得到一个类似于["this","that"]的列表。我该怎么做?


需要使用正则表达式吗? - Ma0
1
那是我们的想法,但如果有更合理的方法,请务必尝试! - Nonancourt
@Nonancourt - 在几乎所有情况下,正则表达式都是最快且最易读的方法。当然,您可以手动搜索字符串,但必须有非常充分的理由才能选择这种方式。 - zwer
@Ev.Kounis,你在没有使用re的情况下是如何思考的?我很好奇。 - Chris_Rands
2个回答

10

使用re.findall()函数:

result = re.findall(r'var="(.*?)"', test)
print(result)  # ['this', 'that']

如果 test 字符串包含多行,使用 re.DOTALL 标志。

re.findall(r'var="(.*?)"', test, re.DOTALL)

1
如果字符串包含\n,则此解决方案无法正常工作。如何修改此答案以支持:test = 'someth1 var="this \n then" someth2 var="that" ' - Alex Fine
2
@AlexFine 如果你需要它在多行上工作,你需要在匹配时设置re.DOTALL标志,以便点号匹配新行。你可以显式地传递标志:re.findall(r'var="(.*?)"', test, re.DOTALL),或者在模式中使用内联语法:re.findall(r'(?s)var="(.*?)"', test) - zwer

1
您当前使用的正则表达式存在问题,捕获组(.*)是一个极度贪婪的语句。在字符串中第一次出现var=后,该捕获组将获取之后的所有内容
如果您将表达式的概括减少到var="(\w+)",则不会遇到同样的问题,因此将那行python代码更改为:
result = re.findall(r'var="([\w\s]+)"', test)

如果输入字符串包含var="foo bar"(或任何非单词字符),并且假设他想提取引号之间的所有内容,那么这将失败。 - zwer
@zwer 是的,这可能是正确的,但如果引号内的单词被用作变量,如 var= 前缀所示(这个假设最好不要在 OP 没有指定的情况下做出),那么内容将永远不会有空格。 - m_callens
\w 将会匹配数字,但是 3this 不是一个合法的变量名。 - zwer
感谢规范,@zwer。实际上,我对一般情况很感兴趣,当它可能是var="foo bar"时。 - Nonancourt
@Nonancourt 好的,我现在会进行修订。 - m_callens
@zwer的回答同样适用,我只是不赞成在表达式中使用“.”。 - m_callens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接