Python正则表达式匹配,直到识别后的某个单词

时间:2016-08-24 10:08:59

标签: python regex

给出以下字符串或类似字符串:

baz: bar
key: >
   lorem ipsum 1213 __ ^123   
   lorem ipsum

foo:bar
anotherkey: >
   lorem ipsum 1213 __ ^123   
   lorem ipsum

我正在尝试构建一个REGEX,它捕获一个键后跟>符号后的所有值。

因此,对于上面的示例,我想匹配从keyfoo(不包括),然后从anotherkey到结尾。我设法提出了一个REGEX来完成这项工作,但前提是我知道foo的名字:

\w+:\s>\n\s+[\S+\s+]+(?=foo)

但这不是一个好的解决方案。如果我删除?=foo,那么匹配将包含字符串末尾的所有内容。 如何修复此正则表达式以匹配>之后的值?

3 个答案:

答案 0 :(得分:2)

(根据要求;)

您可以使用类似

的内容
^\w+:\s*>\n(?:[ \t].*\n?)+

(这是没有小组的。如果你决定不同他们,请看问题的评论。)

它匹配行的开头(^),后跟至少一个单词字符(\w AZ,az,0-9或' - '。可以更改为{{1}如果只允许使用小写字母alpha。)

然后它匹配可选空格([a-z]),后跟\s* 键终结符和换行符(>)。

然后匹配的非捕获组(\n):

  • 空格或标签
  • 后跟任意字符到换行符
  • 可选换行

此组(与缩进行匹配)可以重复多次(但必须至少存在一次 - (?:)。

See it here at regex101

答案 1 :(得分:1)

你可以调整你的正则表达式:

(\w+:\s+>\n\s+[\S\s]+?)(?=\n\w+:\w+\n|\Z)

RegEx Demo

Lookahead (?=\n\w+:\w+\n|\Z)将在您非贪婪的匹配后声明key:value或结束输入(\Z)。

或者可以使用性能更好的正则表达式(感谢Wiktor下面的有用评论):

\w+:\s+>\n(.*(?:\n(?!\n\w+:\w+\n).*)+)

RegEx Demo 2

答案 2 :(得分:0)

如果您不确定缩进是否存在,那么这是最简单的方式,您可以获得所需的结果:

^\w+:\s+>(?:\s?[^:]*$)*

Live demo

说明:

^               # Start of line
\w+:\s+>        # Match specific block
(?:             # Start of non-capturing group (a)
    \s?             # Match a newline
    [^:]*$          # Match rest of line if only it doesn't have a :
)*              # End of non-capturing group (a) (zero or more times - greedy)

您需要启用m标志,如现场演示中所示。

两个 - 最简单的

如果始终存在前导空格,那么你可以使用这个更安全的正则表达式:

^\w+:\s+>(?:\s?[\t ]+.*)*

Live demo

m修饰符也应在这里设置。