gpt4 book ai didi

python - GBP/USD/EUR 的货币正则表达式

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:03 24 4
gpt4 key购买 nike

需要一些帮助来创建满足以下规则的正则表达式。任何建议将不胜感激。

(1a.) 可以选择从以下内容开始: £,$,€

1b.货币值必须以一到三位数字开头

2a.逗号前:必须是一到三位数字

2b.逗号后:必须是三位数

2c。小数点后:只能是数字

3a.货币值必须以一位或多位数字结尾

[3b.] 值后面可以跟: tn/Tn/Trillion/万亿,bn/Bn/Billion/billion,m/Million/百万。

(3c.) 可选择以以下结尾: p/P/Pence/便士,c/C/Cents/cents,€/Euro(s)/euro(s),Dollars/dollars,Pounds/pounds。

规则 1a 和 3c 相互排斥,但必须使用其中之一:

$1 dollar ✘
1 ✘
$1 ✓
1 dollar ✓

规则 3b 可以与规则 1a 或 3c 一起使用,但不需要同时使用:

$1 trillion ✓
1 trillion dollars ✓
$1 ✓

规则 2a/2b 可以使用零次或多次:

$1 ✓
$1,000,000,000,000 ✓

规则 2c 只能使用一次或零次:

$1 ✓
$1.000 ✓

预期结果:

$1 dollar ✘
1 ✘
$1,00000.000,000 ✘
1,000.00 ✘

$1 ✓
1 dollar ✓
$1 trillion ✓
1 trillion dollars ✓
$1,000,000,000,000 ✓
$1.000 ✓
$1,000,000,000,000.000000 ✓

这是我目前所拥有的:

[£€$]?[0-9]+[,.]?[0-9][pcm][ euros| euro]*

最佳答案

以下正则表达式不依赖于单独行上的值,但也会从句子中获取它们。

它还假设单位“cents”、“dollars”和“pounds”可以是单数。

此外,它允许单词和数字之间有无限的空格,并且数字和后面的值单词或单位之间没有空格。

解释:

以下是正则表达式的基本结构,子表达式由两个 @ 包围的值表示:

(@Prefix@)?(?=(@Value@)(\s*@Postfix@)?)(?(1)\2(?!\3)|(?<!@Prefix@)\2\3)
|________| |_______||____________| |______________________________|
| | | |
Group 1 Group 2 Group 3 Prefix-Postfix Selector

第 1 组可选择匹配前缀。

第 2 组和第 3 组在前瞻中捕获,因此当执行 Prefix-Postfix Selector 时,只有第 1 组是整体匹配的一部分。

Prefix-Postfix Selector 是执行以下操作的条件语句:

  • 如果第 1 组(前缀)匹配,则将第 2 组()添加到整体匹配中,前提是没有第 3 组(后缀) 跟随它。

  • 如果没有 Prefix 匹配,则将整体匹配设置为 Value 后跟 Postfix 当且仅当没有 Value 之前的前缀

子表达式相当不言自明。 \b 确保匹配整个单词。类似地,数字后的否定前瞻 (?![\d.,]) 确保没有遗漏任何数字、逗号和小数点。

@前缀@:

[£€$]

@值(value)@:

\d{1,3}(?:,\d{3})*(?:\.\d+)?(?![\d.,])(?:\s*(?:[tTbB]n|m|(?:[tT]r|[bBmM])illion)\b)?
|_____||_________||________|| || |
|__________________________||________||____________________________________________|
| | |
Number, e.g. 12,345.6 | [[Whitespace] + Value Word, e.g. Tn or Billion]
|
Makes sure "1000" is not matched, for example

@后缀@:

\s*(?:[pP](?:ence)?|[cC](?:ents?)?|€|[eE]uros?|[dD]ollars?|[pP]ounds?)\b

解决方案:

用子表达式替换占位符导致这个完整的正则表达式:

([£€$])?(?=(\d{1,3}(?:,\d{3})*(?:\.\d+)?(?![\d.,])(?:\s*(?:[tTbB]n|m|(?:[tT]r|[bBmM])illion)\b)?)(\s*(?:[pP](?:ence)?|[cC](?:ents?)?|€|[eE]uros?|[dD]ollars?|[pP]ounds?)\b)?)(?(1)\2(?!\3)|(?<![£€$])\2\3)

Demo


注意事项:

  • 不会匹配出现在句子中后跟逗号或句号的值,如“$1”。 (例如,在句子This sentence is worth $1, $2 or $3.中只匹配$2。)

  • 由带逗号和/或小数点的数字组成的值允许使用值词,例如“10000亿”。

关于python - GBP/USD/EUR 的货币正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47285060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com