python正则表达式直到第一组数字

时间:2019-03-19 20:41:17

标签: python regex

我有以下文字:

  

海岸维修,*弗吉尼亚州诺福克市获得了不超过212,967,725美元的固定价格,无限期交付/不确定数量(IDIQ)多次授予合同(MAC),用于船舶维修,维护和现代化根据佛罗里达州Mayport的第一批水面战斗舰(DDG和CG)级和两栖(LSD,LPD和LHD)级船舶。该奖项是根据当前IDIQ-MAC Lot 1的滚动许可而获得的。期权如果被行使,将使该合同的累计价值达到376,964,825美元。

我正在尝试捕获第一个逗号,第二个逗号,第三个逗号和金额$ 212,967,725左侧的文本。

到目前为止,我的正则表达式为:(.*)(?:, )(?:.*)(?:\$([0-9,]+)

但是,这几乎捕获了与该表达式匹配的所有内容。有没有一种方法或标志可以在捕获最后一组数字之后停止比赛,然后出现空格?

所以我的最终目标是获得:

('Coast Repair,* Norfolk, Virginia', '212,967,725')

2 个答案:

答案 0 :(得分:2)

让我们尝试使用正则表达式来获取“直到0-9字符串之前的最后一个逗号为止的所有内容”,而不是尝试捕获特定数量的逗号。该正则表达式将是

([^$]*),.*?\$([0-9,]+)

所以基本上,逐步地

  • ([^$]*)捕获每个非$字符。要使事物停在第一个美元符号而不是最后一个美元,[^$]而不是.很重要。
  • \$([0-9,]+)用逗号捕获数字,并在数字后立即加一个美元符号
  • ,.*?有效地匹配美元符号之前的最后一个逗号,然后懒惰地吃掉逗号和第一个美元符号之间的所有字符。

Here's a regex101 link to show it works

答案 1 :(得分:0)

采取两步法:

  • 在金额之前查找文本(最多前$个字符-组#1) 以及金额本身(第2组)。
  • 用逗号分隔#1组。

因此第一步要使用的模式是:

pat1 = re.compile(r'^([^$]+)(\$[\d,]+)')

然后使用模式:

m = pat1.search(txt)

并保存两个捕获组:

g1 = m.group(1)
g2 = m.group(2)

然后在每个逗号之前找到部分文本(第2步):

g1.split(',')

获取:

['Coast Repair', '* Norfolk', ' Virginia', ' is awarded a not-to-exceed ']

(第一个逗号(Coast Repair),第二个逗号(* Norfolk)之前的文本, 第三逗号(Virginia),最后在金额前 (is awarded a not-to-exceed)。

当然,金额在g2变量中,因此您也可以打印它。