我有以下文字:
海岸维修,*弗吉尼亚州诺福克市获得了不超过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')
答案 0 :(得分:2)
让我们尝试使用正则表达式来获取“直到0-9字符串之前的最后一个逗号为止的所有内容”,而不是尝试捕获特定数量的逗号。该正则表达式将是
([^$]*),.*?\$([0-9,]+)
所以基本上,逐步地
([^$]*)
捕获每个非$
字符。要使事物停在第一个美元符号而不是最后一个美元,[^$]
而不是.
很重要。\$([0-9,]+)
用逗号捕获数字,并在数字后立即加一个美元符号,.*?
有效地匹配美元符号之前的最后一个逗号,然后懒惰地吃掉逗号和第一个美元符号之间的所有字符。答案 1 :(得分:0)
采取两步法:
$
个字符-组#1)
以及金额本身(第2组)。因此第一步要使用的模式是:
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
变量中,因此您也可以打印它。