繁体   English   中英

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

[英]Python regex match until certain word after identaion

给定以下字符串或类似内容:

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

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

我试图建立一个正则表达式,它捕获一个键后跟一个>符号后的所有值。

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

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

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

(按要求 ;)

您可以使用类似

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

(这没有小组。如果您决定不参加,请参阅问题的注释。)

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

然后,它匹配可选的空格( \\s* ),后跟> 键终止符和换行符( \\n )。

然后是一个非捕获组( (?: :)匹配:

  • 空格或制表符
  • 随后是任意字符,直到换行符
  • 可选的换行

该组(与缩进线匹配)可以重复任意次(但必须至少存在一次- )+ )。

在regex101上看到它

您可以将正则表达式调整为:

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

正则演示

在非贪婪匹配之后,先行(?=\\n\\w+:\\w+\\n|\\Z)会断言key:value或输入结尾( \\Z )的存在。

另外,也可以使用性能更好的正则表达式(感谢Wiktor提供以下有用的注释):

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

RegEx演示2

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

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

现场演示

说明:

^               # 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 ]+.*)*

现场演示

m修饰符也应在此处设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM