我有一个很长的非结构化文本,我需要提取文本组。
我有一个理想的开始和结束。
这是截断非结构化文本的示例:
more useless gibberish at the begininng...
separated by new lines...
START Fund Class Fund Number Fund Currency
XYZ XYZ XYZ USD
bunch of text with lots of newlines in between... Closing 11.11 1,111.11 111,111.11
more useless gibberish between the groups...
separated by new lines...
START Fund Class Fund Number Fund Currency
XYZ XYZ XYZ USD
The word START appears in the middle sometimes multiple times, but it's fine bunch of text with lots of newlines in between... Closing 22.22 2,222.22 222,222.22
more useless gibberish at the end...
separated by new lines...
在上面的示例中,我想提取出位于START
和Closing
我使用正则表达式成功完成了
/(?<=START)(?s)(.*?)(?=Closing)/g
这是结果https://regex101.com/r/vo7CLx/1/
不幸的是,我还需要提取包含Closing
字符串的行的结尾。
如果您从regex101
链接注意到第一场比赛中有Closing 11.11 1,111.11 111,111.11
。第二场比赛中Closing 22.22 2,222.22 222,222.22
。
正则表达式不匹配。
有没有办法在单个正则表达式中执行此操作?所以即使包含数字的结尾标签也包括在内?
答案 0 :(得分:1)
(START)(?s)(.*?)(Closing)(\s+((,?\d{1,3})+.\d+))+
应该匹配您想要的所有内容see here!
答案 1 :(得分:1)
试试这个正则表达式:
(?s)(?<=START)(.*?Closing(?:\s*[\d.,])+)
<强>解释强>
(?s)
- 单行修饰符,表示正则表达式中的.
将与换行符匹配(?<=START)
- 找到紧靠START
(.*?Closing(?:\s*[\d.,])+)
- 懒惰地匹配任何字符的0次出现,直到下一次出现单词Closing
,然后是序列(?:\s*[\d.,])+
(?:\s*[\d.,])+
- 匹配空格后跟数字或.
或,
的0次出现次数。最后的+
表示我们必须将此子模式匹配1次或更多次答案 2 :(得分:0)