python - Python重新解析文件
问题描述
我正在尝试解析包含多个块的文件。该文件如下所示。
$ 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 这样的块,它在结束页脚之后有一些注释。我基本上需要在开始时找到 $ Start 并找到下一个 $ Start 但在下一个“$ Start”之前找到所有内容。提前非常感谢。
解决方案
您可以使用不属于捕获组的积极前瞻:
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
(区分大小写).*?
匹配任何字符*?
量词 - 在零次和无限次之间匹配,尽可能少,根据需要扩展(惰性)
- 积极前瞻
(?=(\$ Start|\Z))
- 断言下面的正则表达式匹配
- 第二捕获组
(\$ Start|\Z)
- 第一种选择
\$ Start
\$
匹配字符 $ 字面意思(区分大小写)Start
从字面上匹配字符Start
(区分大小写)
- 第二种选择
\Z
\Z
断言字符串末尾的位置,或字符串末尾的行终止符之前(如果有)
- 第一种选择
全局模式标志
re.MULTILINE
: 多行。导致 ^ 和 $ 匹配每行的开始/结束(不仅是字符串的开始/结束)。re.DOTALL
: 单线。点匹配换行符
您可以在https://regex101.com/r/h27O0d/1查看解释,我根据您的文本开发了正则表达式。
推荐阅读
- python - 使用 json 创建模型对象,其中所有键都不是模型的字段
- python - 使用 sqlalchemy 引擎访问 mysql 数据库时出错
- network-programming - 请求和命令有什么区别?
- javascript - 使用 JavaScript 将 4 位字节数组转换为 int
- validation - 在许多子集的模型验证中使用 Rcpp 而不是 mapply
- android - 用 SharedPreferences 中的对象填充的 RecyclerView 缓慢且滞后
- java - Android Studio:我可以在 Java 代码中引用已启动的服务吗?
- python - 如何沿行压缩或堆叠熊猫数据框?
- r - R中的日期列排序
- java - 如何参考我的代码使用扫描仪阅读器严格允许一个字符作为输入?