如何在正则表达式中写条件?

时间:2019-03-01 12:13:14

标签: regex

我正在尝试从以下字符串中捕获金额:

  

运费$ 2
  促销-(FIRST)($ 4)
   7美元
  新硬币赚了5美元
  代表发行   .......................

“新硬币可赚5美元”行有时可能不会出现。在这种情况下,我愿意记下“ 7”的支付金额。我尝试使用\.?\s*\n*([\d.,]+)\s*\n*Issued\s*\n*on,但这仅在文档中不存在“赚了5美元的新硬币”的情况下才会捕获到该金额。我阅读了有关其他条件和正面预测的信息。但是,无法使其正常工作。关于捕获方法有什么建议吗?

2 个答案:

答案 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

Python 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