【问题标题】:Python re to parse a filePython重新解析文件
【发布时间】:2018-04-29 16:34:01
【问题描述】:

我正在尝试解析包含多个块的文件。该文件如下所示。

$ Start of something1
.........contents
.........
$ End of something1
$ Start of something2
..........
..........
$ End of something2
some comments that should be included in block2.
$ Start of something3
.......
.......
$ End of something3

我已经成功地从第一行($ Start)解析到包含“$ End of .....”的块的最后一行。 但是我遇到的问题基本上是针对我的示例中的 2nd 块,它在结束页脚之后有一些 cmets。 我基本上需要在开始时找到 $ Start 并找到下一个 $ Start 但在下一个“$ Start”之前找到所有内容。 提前非常感谢。

【问题讨论】:

  • 你有示例代码吗?你使用嵌套的for 循环吗?不要将$ End 设为结束条件,只需将下一个$ Start 设为结束条件即可。

标签: python regex python-2.7


【解决方案1】:

您可以使用不属于捕获组的肯定前瞻:

t = """$ Start of something1
.........contents
.........
$ End of something1
$ Start of something2
..........
..........
$ End of something2
some comments that should be included in block2.
$ Start of something3
.......
.......
$ End of something3""" 


import re

for k in re.findall(r'(\$ Start of .*?)(?=(?:\$ Start|\Z))',t,re.DOTALL|re.MULTILINE):
        print "------ new find --------" 
        print k  
        print "------- end ------------\n\n" 

输出:

------ new find --------
$ Start of something1
.........contents
.........
$ End of something1

------- end ------------


------ new find --------
$ Start of something2
..........
..........
$ End of something2
some comments that should be included in block2.

------- end ------------


------ new find --------
$ Start of something3
.......
.......
$ End of something3
------- end ------------

说明:

该模式捕获以文字 $ Start of 开头的组,后跟尽可能少的字符(包括由于 re.DOTALL 引起的换行符),以便匹配后跟 $ Start\Z == 字符串结尾.

(?=..) 是正向前瞻,它的内容 (?:\$ Start|\Z) 不属于它之前的组,并且它自己的组是非捕获的。

  • 第一捕获组(\$ Start of .*?)
    • \$ 匹配字符 $ 字面意思(区分大小写)
    • Start of 与字符 Start of 逐字匹配(区分大小写)
    • .*? 匹配任何字符
      • *? Quantifier — 匹配零次到无限次,尽可能少,根据需要扩展(惰性)
  • 正向超前(?=(\$ Start|\Z))
    • 断言下面的正则表达式匹配
    • 第二捕获组(\$ Start|\Z)
      • 第一选择\$ Start
        • \$ 匹配字符 $ 字面意思(区分大小写)
        • Start 匹配字符 Start 字面意思(区分大小写)
      • 第二选择\Z
        • \Z 在字符串末尾断言位置,或在字符串末尾的行终止符之前(如果有)

全局模式标志

  • re.MULTILINE:多行。导致 ^ 和 $ 匹配的开始/结束 每行(不仅是字符串的开头/结尾)re.

  • re.DOTALL:单行。点匹配换行符

你可以在https://regex101.com/r/h27O0d/1查看解释,我根据你的文字开发了正则表达式。

【讨论】:

  • 感谢您的反对。很高兴知道我的回答在哪里没有帮助,所以我可以改进它。 #
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 2011-10-01
  • 2023-03-26
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多