【问题标题】:Can I match an or expression in regex multiple times?我可以多次匹配正则表达式中的 or 表达式吗?
【发布时间】:2018-09-19 04:43:08
【问题描述】:

我想知道是否有可能有一个正则表达式来检测

  1. or 语句的单词组合
  2. 单词组合,如果它们之间有不同的单词或符号

    我有以下正则表达式:

    (\$[\s]?([\d\,]+)([\.\d*](\d*))?([\s]?(hundred|thousand|million|billion|trillion))?)|((((one|two|three|four|four|five|five|six|six|seven|seven|eight|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|hundred|third|quarter|fifth|half|hundred|thousand|million|billion|trillion)[\s]?)+)?([\d\.\,\"a"]+)?([\s]*(dollars|dollar|USD)))

这应该识别所有可能的美元金额“类型”,例如:

$1.5 美元/美元,20,000 美元,$1.5

,以及

五百美元'

你明白了。

我想知道我是否可以让它工作以便能够识别类似的东西

九十五美元

(第二点)(九和五都在名单上,但我也不知道如何数破折号。

还有类似的

10 加元

(第 1 点) 只是 \w 不起作用,因为它会捕获“美元”之前可能不需要的单词,例如

强势美元

我发现regex101 对于查看正则表达式及其效果非常有用,但我无法弄清楚

【问题讨论】:

  • 你也要配九十五块吗?
  • @ran_0315 是的,我想匹配它

标签: python regex


【解决方案1】:

您所需要的只是在字符集中添加一个破折号,该字符集紧随那里的大组。目前是[\s];改成[\s-]:

(\$[\s]?([\d\,]+)([\.\d*](\d*))?([\s]?(hundred|thousand|million|billion|trillion))?)|((((one|two|three|four|four|five|five|six|six|seven|seven|eight|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|eightteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|hundred|third|quarter|fifth|half|hundred|thousand|million|billion|trillion)[\s-]?)+)?([\d\.\,\"a"]+)?([\s]*(dollars|dollar|USD)))
                                                                                                                                                                                                                                                                                                                                                                           ^

https://regex101.com/r/1TQLf2/

要匹配“...美元”之外的“...加元”,请将“加元”添加到您当前的 (dollars|dollar|USD) 组。改为

(Canadian dollars|dollars|dollar|USD)

(如果你不使用/i,可能是([Cc]anadian dollars|...

【讨论】:

    【解决方案2】:

    给你这个礼物

    (?:USD *)?(?:(?P<num1>\$(?:\d+[,.]?)+)(?: *(?P<mod1>(?:(?:hundred|thousand|million|billion|trillion)[ -]*)+)? *(?:(?P<badge1>(canad(?:ian|a) *)?dollars?\b|cent[s.]?\b)?))|(?:(?P<num2>(?:\d+[,. ]?)+)|(?P<txt>\b(?:(?:one|quarter|two|ninety|five|a|half|one|three|twenty)[ -]??)+))(?: *(?P<mod2>(?:(?:hundred|thousand|million|billion|trillion)[ -]*?)+ *)?(?:(?P<badge2>(canad(?:ian|a) *)?dollars?|cent[s.]?)\b)))(?: */ *dollar)?
    

    body {
      margin: 0;
      height: 100vh;
    }
    iframe {
      height: 100vh;
    }
    <iframe frameborder="0" 
            width="100%" height="100vh" 
            src="https://vquilon.github.io/beyond-regex/panels/visualizer#!embed=true&flags=img&re=(%3F%3AUSD%20*)%3F(%3F%3A(%3FP%3Cnum1%3E%5C%24(%3F%3A%5Cd%2B%5B%2C.%5D%3F)%2B)(%3F%3A%20*(%3FP%3Cmod1%3E(%3F%3A(%3F%3Ahundred%7Cthousand%7Cmillion%7Cbillion%7Ctrillion)%5B%20-%5D*)%2B)%3F%20*(%3F%3A(%3FP%3Cbadge1%3E(canad(%3F%3Aian%7Ca)%20*)%3Fdollars%3F%5Cb%7Ccent%5Bs.%5D%3F%5Cb)%3F))%7C(%3F%3A(%3FP%3Cnum2%3E(%3F%3A%5Cd%2B%5B%2C.%20%5D%3F)%2B)%7C(%3FP%3Ctxt%3E%5Cb(%3F%3A(%3F%3Aone%7Cquarter%7Ctwo%7Cninety%7Cfive%7Ca%7Chalf%7Cone%7Cthree%7Ctwenty)%5B%20-%5D%3F%3F)%2B))(%3F%3A%20*(%3FP%3Cmod2%3E(%3F%3A(%3F%3Ahundred%7Cthousand%7Cmillion%7Cbillion%7Ctrillion)%5B%20-%5D*%3F)%2B%20*)%3F(%3F%3A(%3FP%3Cbadge2%3E(canad(%3F%3Aian%7Ca)%20*)%3Fdollars%3F%7Ccent%5Bs.%5D%3F)%5Cb)))(%3F%3A%20*%2F%20*dollar)%3F&reLang=python">
            </iframe>

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多