regex - 子字符串之间的正则表达式拆分文件
问题描述
我有一个 CSV 文件,其中包含来自多个变量的数据,我想将它们分开。我的文件如下所示:
VARIABLE: GRP1.SGRP1.100:VAR1
Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048
VARIABLE: GRP1.SGRP2.102:VAR1
Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048
我想在每次出现子字符串“VARIABLE”时将其拆分,生成两个字符串:
VARIABLE: GRP1.SGRP1.100:VAR1
Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048
和
VARIABLE: GRP1.SGRP2.102:VAR1
Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048
类似的东西VARIABLE[^V]+
似乎可以工作,但它应该以某种方式在下一次发生时终止,我不知道如何。谢谢
解决方案
您可以使用两种方法,匹配和拆分。
拆分是一种更简单的方法,因为模式看起来像(?!^)(?=VARIABLE)
,但有一个警告:Matlab 正则表达式默认情况下需要非空匹配项(noemptymatch
选项是默认值)。您需要传递emptymatch
选项以regexp
使其正常工作:
splitStr = regexp(str,'\s*(?!^)(?=VARIABLE)','split', 'emptymatch')
输出:
splitStr =
{
[1,1] = VARIABLE: GRP1.SGRP1.100:VAR1
Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048
[1,2] = VARIABLE: GRP1.SGRP2.102:VAR1
Timestamp (LOCAL_TIME),Value
2018-07-18 13:52:09.100,25582
2018-07-18 13:52:49.900,24048
}
该(?!^)(?=VARIABLE)
模式匹配字符串中不在字符串开头但紧随其后的VARIABLE
子字符串的任何位置。
或者,您可以匹配VARIABLE
,然后匹配任意数量的非V
s 或V
不跟随s 的 s ARIBALE
:
matchStr = regexp(str,'VARIABLE[^V]*(?:V(?!ARIABLE)[^V]*)*','match')
请参阅正则表达式演示。
细节
VARIABLE
- 一个VARIABLE
子串[^V]*
- 一个否定字符类,匹配 0 个或多个其他字符V
(?:V(?!ARIABLE)[^V]*)*
- 零次或多次连续出现V
- 一个V
字符是(?!ARIABLE)
- ... 不跟随ARIABLE
[^V]*
- 0 个或更多字符,而不是V
.
请注意,它在“词法上”与VARIABLE(?:(?!VARIABLE).)*
(使用缓和的贪婪标记)或VARIABLE.*?(?=VARIABLE|$)
(使用惰性点模式和仅正向前瞻)相同,但更有效,因为它遵循展开循环原则。(请注意,.
在 Matlab 中,正则表达式匹配任何字符,包括换行符,因此在 Matlab 中使用这两种模式时无需使用任何其他标志)。
推荐阅读
- c++ - 我遇到了 C++“参数太多”警告的问题
- python - SQLAlchemy 有最大数量的关系?
- c++ - CPP 中的 ++ 运算符是否对 char 有任何重载?
- python - 为列表列表中的每个列表映射一个函数
- python - 如何让 Pandas 从下一行开始在新列中创建 sumsum?
- mfc - MFC CImageList DeleteImageList() vs Remove()
- android - Android studio 线性布局问题:我应该如何在没有嵌套权重的情况下布局我的?
- python - 16位PNG的像素值20930不应该是灰色阴影吗?
- numpy - Python 向量没有列大小?/ Theta 初始化为全 0
- python - 如何在不手动下载模型的情况下访问/使用谷歌预训练的 Word2Vec 模型?