Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 如何在正则表达式中写入If条件?_Regex - Fatal编程技术网

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

Regex 如何在正则表达式中写入If条件?,regex,Regex,我试图从以下字符串中获取金额: 送货费2美元 促销—(第一次)(4美元) $7 新硬币赚了5美元 代 “新硬币赚了5美元”这一行可能在某个时候不会出现。我愿意捕获支付的金额,在本例中为“7”。我尝试了\.?\s*\n*([\d,]+)\s*\n*发行的\s*\n*在上,但这只会在文档中不存在“新赚5美元的硬币”时捕获金额。我读到了if-else条件和积极展望。但是,无法使其工作。关于如何捕获的任何建议?因为您需要的值总是在前面加上$,您可以使用另一行 \$(\d[\d,.]*)[\n\r]+(

我试图从以下字符串中获取金额:

送货费2美元
促销—(第一次)(4美元)
$7
新硬币赚了5美元


“新硬币赚了5美元”这一行可能在某个时候不会出现。我愿意捕获支付的金额,在本例中为“7”。我尝试了
\.?\s*\n*([\d,]+)\s*\n*发行的\s*\n*在
上,但这只会在文档中不存在“新赚5美元的硬币”时捕获金额。我读到了if-else条件和积极展望。但是,无法使其工作。关于如何捕获的任何建议?

因为您需要的值总是在前面加上
$
,您可以使用另一行

\$(\d[\d,.]*)[\n\r]+(?:.*[\r\n]+){0,2}Issued\s+on\b
您需要的值在组1中

详细信息

  • \$
    -a
    $
    字符
  • (\d[\d,.]*)
    -第1组:一个数字,后跟任何0+位、
    字符
  • [\n\r]+
    -1个或多个CR或LF符号
  • (?:.[\r\n]+){0,2}
    -0,重复1或2次0+字符(换行符除外),后跟1+LF/CR符号
  • Issued\s+on\b
    -
    Issued
    ,1+空格,
    on
    作为一个完整的单词(因为
    \b
    是一个单词边界)

:

您可以像
(?(?=regex)then | else)
那样执行,但请注意,
(?=)
是向前看的,长度为零,因此您的then条件也必须与括号中的表达式相匹配

您还可以以某种方式生成更复杂的表达式
(?(?=条件)(then1 | then2 | then3)|(else1 | else2 | else3))
其中
then1,then2,then3
按优先级降序排序,因为第一个匹配的“then”条件将跳过所有其他条件


您可以查找更多信息

为什么不干脆
^\$(\d+)$
?请看,您如何描述要匹配的上下文?您想要的值是否始终位于单独的行上?请尝试在
上发布(
^\$(\d[\d,]*)[\r\n]*(?:.[\r\n]+)*也可以()。@WiktorStribiżew只有在我的金额少于1000美元时才有效。超过$1000,写为$1000,并且金额可能为$5.6,然后
^\$(\d[\d,.]*)$
?它是否总是在前面加上
$
,并且在单独的一行?@WiktorStribiżew是的,它总是在单独的一行前面加上$。问题中显示的文档是一家公司的收据。我正在下载收据的HTML并删除HTML标记以仅显示文本。因此,在这两者之间可能会有空格和新行。例如:$7可能写在宣传片下面的几个空格和两行之后。这就是为什么我在
@SuloveBista上写了这个正则表达式
\?\s*\n*([\d,]+)\s*\n*发出的\s*\n*好的,在
发出的
之前可能会有一两行?我已编辑解决方案以满足这些要求。我希望他们是最后一个。1行或2行可以在金额之前,也可以在金额之后。
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