【问题标题】:Python: Find a string between two strings, repeatedlyPython:重复查找两个字符串之间的字符串
【发布时间】:2017-07-07 05:57:46
【问题描述】:

我是 Python 新手,还在学习正则表达式,所以这个问题对于一些正则表达式专家来说可能听起来微不足道,但你可以去。 我想我的问题是对this question about finding a string between two strings 的概括。我想知道:如果这种模式(initial_substring + substring_to_find + end_substring)在一个长字符串中重复多次怎么办? 例如

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

相反,我想获得类似["this","that"] 的列表。 我该怎么做?

【问题讨论】:

  • 必须是regex吗?
  • 原来是这样,但如果有更明智的方法,请这样做!
  • @Nonancourt - 几乎在任何情况下,正则表达式都不是最快和最“可读”的方式。当然,您可以进行手动字符串搜索,但您需要有一个非常好的理由才能走这条路。
  • @Ev.Kounis 如果没有re,你会怎么想?我很好奇

标签: python regex string


【解决方案1】:

使用re.findall():

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

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

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

【讨论】:

  • 如果字符串包含\n,则此解决方案不起作用。如何调整此答案以支持: test = 'someth1 var="this \n then" someth2 var="that" '
  • @AlexFine 如果您需要它在多行上工作,您需要在匹配时设置re.DOTALL 标志,以便点匹配新行。您可以将标志显式传递为:re.findall(r'var="(.*?)"', test, re.DOTALL),或在模式中使用内联语法:re.findall(r'(?s)var="(.*?)"', test)
【解决方案2】:

您当前的regex 的问题是捕获组(.*) 是一个非常贪婪的声明。在您的字符串中出现var= 的第一个实例之后,该捕获组将获得everything

如果您改为将表达式的泛化减少为var="(\w+)",您将不会遇到同样的问题,因此将python 的那一行更改为:

result = re.findall(r'var="([\w\s]+)"', test)

【讨论】:

  • 如果输入字符串包含var="foo bar"(或任何非单词字符),假设他想提取引号之间的所有内容,这将失败。
  • @zwer 是的,这可能是真的,但如果引号中的单词根据var= 前缀用作变量(如果没有指定 OP,最好不要做出这种假设),内容永远不会有空格
  • \w 也会捕获数字,3this 也不是有效的变量名。
  • 感谢您的规范,@zwer。是的,事实上,我会对一般情况感兴趣,因为它可能是var="foo bar"
  • @Nonancourt 好的,我现在就修改。
猜你喜欢
  • 2020-05-28
  • 2011-03-23
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
相关资源
最近更新 更多