我正在尝试从以下字符串中捕获金额:
运费$ 2
促销-(FIRST)($ 4)
7美元
新硬币赚了5美元
代表发行 .......................
“新硬币可赚5美元”行有时可能不会出现。在这种情况下,我愿意记下“ 7”的支付金额。我尝试使用\.?\s*\n*([\d.,]+)\s*\n*Issued\s*\n*on
,但这仅在文档中不存在“赚了5美元的新硬币”的情况下才会捕获到该金额。我阅读了有关其他条件和正面预测的信息。但是,无法使其正常工作。关于捕获方法有什么建议吗?
答案 0 :(得分:1)
由于您所需的值始终在您可以使用的单独行上以$
开头
\$(\d[\d,.]*)[\n\r]+(?:.*[\r\n]+){0,2}Issued\s+on\b
您需要的值在组1中。
详细信息
\$
-一个$
字符(\d[\d,.]*)
-第1组:一个数字,后跟0+个数字,,
或.
个字符[\n\r]+
-1个或多个CR或LF符号(?:.*[\r\n]+){0,2}
-除换行符以外的0+个字符的0、1或2个重复,后跟1+ LF / CR符号Issued\s+on\b
-Issued
,1个以上的空格,on
作为整个单词(因为\b
是单词边界)。请参见regex demo。
import re
rx = r"\$(\d[\d,.]*)[\n\r]+(?:.*[\r\n]+){0,2}Issued\s+on\b"
s = "Delivery Charge $2\nPromo - (FIRST) ($4)\n$1,000.55\nNew Coins earned $5\nIssued on behalf of ......................."
match = re.search(rx, s, re.M)
if match:
print(match.group(1)) # -> 1,000.55
答案 1 :(得分:0)
您可以像(?(?=regex)then|else)
一样进行操作,但是请注意(?=)
是超前的并且长度为零,因此您的条件也必须匹配括号中的表达式。
您还可以通过某种方式制作更复杂的表达式
(?(?=condition)(then1|then2|then3)|(else1|else2|else3))
then1, then2, then3
以优先级降序排列,因为首先匹配“ then”的条件将跳过所有其他条件。
您可以查找更多信息here