Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex-字符串前一年的第一个实例_Regex - Fatal编程技术网

Regex-字符串前一年的第一个实例

Regex-字符串前一年的第一个实例,regex,Regex,示例文本: 2019 2018 2017 ... 2015 2014 2013 负债总额14551633 股东权益2100 2599 期望输出: 全场比赛: 2015 2014 2013 负债总额14551633 股东权益2100 2599 第一组(年份)=2015年、2014年、2013年 第2组(目标数据)=股东权益2100 2599 我只需要匹配20xx年,19xx年。 目标后面的数字可以大于或小于2,可以包含也可以不包含,或者前面有$符号 ((?:20\d\d\s*|19\d\d\s*)

示例文本: 2019 2018 2017 ... 2015 2014 2013 负债总额14551633 股东权益2100 2599

期望输出: 全场比赛: 2015 2014 2013 负债总额14551633 股东权益2100 2599

第一组(年份)=2015年、2014年、2013年 第2组(目标数据)=股东权益2100 2599

我只需要匹配20xx年,19xx年。 目标后面的数字可以大于或小于2,可以包含也可以不包含,或者前面有$符号

((?:20\d\d\s*|19\d\d\s*)+).*(stockowners'\s+equity\s+(?:\s*\$?\s*\d+,?\d+)+)
(注:我已勾选了dotall标志)

当前正则表达式的问题在于,它先提取第一组日期,然后提取所有数据,直到股东权益。如何提取最后的日期序列?我曾想过反转字符串并向后搜索,但它是一个很大的文本文件,而且耗时太长

任何帮助都将不胜感激


第二个例子: 字符串:“2019年2018年资产300美元2017年负债100美元权益200美元” 和目标股权 我想选择第1组:2017年至2016年,第2组:股权200美元;完全匹配:2017年2016年负债100美元权益200美元

阐述: 我正试图使用正则表达式从旧的SEC文件中获取信息(大部分是10 ks)。这些文档没有足够的html标记,无法使用beautifulsoup进行解析。我从一次这样的文件中复制了以下内容。假设我想收集有关投资证券的数据。我想得到101017和91339,但2001年和2000年在顶部;以便我知道这些数字对应的年份

我的问题是这些文档充满了表格,它们都以年份开头(但不总是相同的年份)。我想从下表中选择我的目标投资证券的年份

截至2001年12月31日(以百万计)2000年


资产 现金及等价物9082美元8195美元
投资证券101017 91339

您可以使用match,直到最后一次出现匹配19或20,后跟2个数字,其中没有数字后跟左侧的空格,然后在组1中捕获重复年份部分

然后捕获第2组中的股东部分

((?:\b(?:20|19)\d\d\s+)+)(?!.*(?:\b(?:20|19)\d\d\b)).*?\s+((?:stockowners'\s+)?\bequity\s+\$?\s*\d+(?:,\d+)?(?:\s+\$?\s*\d+(?:,\d+)?)*)$
图案会匹配的

  • Capturegroup 1
    • (?:\b(?:20 | 19)\d\d\s+)
      重复1+次匹配20或19,后跟2位数字和1+空格字符
  • 关闭第1组
  • (?!.*(:\b(?:20 | 19)\d\d\b))
    负前瞻,断言右侧不再出现年份模式
  • *?\s
    尽可能将除换行符以外的任何字符的0+倍匹配,并匹配空白字符
  • 捕获第2组
    • (?:stockowners'\s+)
      可以选择匹配'stockowners'
    • \bequity\s+
      Match
      equity
    • \$?\s*\d+(?:,\d+)
      匹配可选的
      $
      和带可选小数部分的1+数字
    • (?:\s+\$?\s*\d+(?:,\d+)*
      重复0+次,与前面的部分匹配,并添加1+空格字符
  • 关闭第2组
  • $
    字符串结尾

您能详细说明一下吗?你需要在某个字符串之前出现的前3年吗?在您的全场比赛中排除2019年2018年2017年……的原因是什么?这背后的逻辑是什么?比赛应该在哪里结束?正则表达式本身可以修改为更平滑的东西,但作为一个POC,你要检索什么?@JvdV如果你同意的话,我已经使用POC的消极前瞻性建议更新了我的答案。否则我可以删除我的答案,如果你愿意,你可以把它贴出来。不需要问。@Thefourthbird。我的是一个模拟评论。我想我的解释可能有缺陷。字符串:“2019年2018年资产300美元2017年负债100美元权益200美元”;和目标股权——我想选择第1组:2017年至2016年,第2组:股权200美元;完全匹配:2017年2016年负债100美元股权200美元当我测试上述内容时,我得到了与整个字符串匹配的结果,第一组为2019年2018年,这就成功了。消极前瞻是关键。非常感谢