Python 如何с;是否为美元货币创建正则表达式?
我想为美元货币创建一个正则表达式。 regex应提供以下示例:Python 如何с;是否为美元货币创建正则表达式?,python,regex,Python,Regex,我想为美元货币创建一个正则表达式。 regex应提供以下示例: $ 10 10$ 10 $ 1000005 dollars 这不应该是匹配的: dollars 33 我已经使用了以下表达式: r_dollar = r'(\$|\$usd|usd|dollar(s)?|bucks)' number = '([1-9]([0-9])+)' valuta_with_num = u'(({0})\s?{1})|({1}\s?({0}))'.format(number, r_dolar) curre
$ 10
10$
10 $
1000005 dollars
这不应该是匹配的:
dollars 33
我已经使用了以下表达式:
r_dollar = r'(\$|\$usd|usd|dollar(s)?|bucks)'
number = '([1-9]([0-9])+)'
valuta_with_num = u'(({0})\s?{1})|({1}\s?({0}))'.format(number, r_dolar)
currency_tags = re.compile(u'({0})'.format(valuta_with_num))
如何做到这一点?实现这一点的最简单方法可能是创建多个备选方案:
(\$\s*\d+\d+\s*\$\d+\s+美元1美元)
请在此处查看它的实际操作:
这是一种简单的方法,但效果很好。根据您的用例,可能不需要包装括号
说明:
我们有4个单独的选项可用,全部由|
(管道)分隔
\$\s*\d+
:搜索美元符号(记住要将其转义!),后跟任意数量的空格(*
:0或更多),后跟至少一个数字(+
:1或更多)\d+\s*\$
:同样的事情,只是反过来:搜索至少一个数字,后跟任意数量的空格,后跟一个美元符号\d+\s+美元
:搜索至少一个数字,后跟至少一个空格,后跟单词美元1美元
:搜索准确的字符串1美元
,因为它不会与美元
(复数)匹配import re
strs = ['Some $ 10 here',
'And 10$ here',
'And 10 $ here',
'And 1000005 dollars here',
'And dollars one million and five here']
r_dollar = r'(?:\$(?:usd)?|(?:dollar|buck)s?)' # USD dollar name
r_textnumber = r'\b(?!\s)(?:[\sa-]|zero|one|tw(?:elve|enty|o)|th(?:irt(?:een|y)|ree)|fi(?:ft(?:een|y)|ve)|(?:four|six|seven|nine)(?:teen|ty)?|eight(?:een|y)?|ten|eleven|forty|hundred|thousand|[mb]illion|and)+\b(?<!\s)'
r_number = r'(?:[1-9][0-9]+|{})'.format(r_textnumber) # Dollar amount
valuta_with_num = r'{0}\s?{1}|{1}\s?{0}'.format(r_number, r_dollar) # Main regex
print(valuta_with_num)
currency_tags = re.compile(valuta_with_num)
for s in strs:
print(currency_tags.findall(s))
将数字作为单词进行匹配的正则表达式部分是
\b(?!\s)(?:[\sa-]|zero|one|tw(?:elve|enty|o)|th(irt(een|y)|ree)|fi(?:ft(?:een|y)|ve)|(?:four|six|seven|nine)(?:teen|ty)?|eight(?:een|y)?|ten|eleven|forty|hundred|thousand|[mb]illion|and)+\b(?<!\s)
\b(?s)(?:[\sa-]| 0 | 1 | tw(?:elve | enty | o)th(irt(een | y | ree)| fi(?:ft(?:een | y)| ve)|(?:四六|七|九|八|:een | y)|一万| |十四|万|百万|?
见附件。详情:
\b(?!\s)
-单词边界后面没有空格
(?:\s |[a-]| 0 | 1 | tw(?:elve | enty | o)th(irt(een | y | ree)fi(?:ft(?:een | y)ve)|(?:四|六|七|九)(青少年| y)八(een | y)|一万|十四|万|万|+
-1个或多个空格重复,a
,-
,0
,…,9
,10
,11
,12
,20
,100
,000
,1000000
,1000000
\b(?-前面没有空格的单词边界
使用您的备选方案的另一个选项可能是:
(?:\$\s*\d+|\d+\s*(?:\$?usd|\$|dollars?|bucks))
解释
(?:
非捕获组
\$\s*\d+
匹配美元符号、0+乘以空格字符和1+位数
|
或
\d+\s*
匹配1+个数字,后跟0+个空格字符
(?:
非捕获组
\$?usd |$\$美元|美元
匹配任何选项,其中\$?
是可选的美元符号
)
关闭非捕获组
)
关闭非捕获组
我同意@christoph的观点
但如果换个角度思考,它可以缩短
^(\$|\d+)(\s*)(\d+|dollar|dollars|\$)$
看到它在行动-
解释
第一组(括号)告诉我们什么可以排在第一位,即$或数字
第二组是空间
第三组告诉我们空格后面可以是什么,即$或美元或美元或数字
希望这有帮助根据OPs问题,一百万美元和五百万美元
不应该是输出的一部分。或者至少这是我的理解。@Asunez我不理解OP也想提取这样的匹配项,但当前的正则表达式不这样做。我在问题的评论中要求澄清,这显然不是clear问题。@Asunez我检查了OP解决方案,它是第一个测试集,但与最后一个测试集不匹配。因此,我认为我的答案正是所需的。似乎是这样,但其他答案无效,因为它们不试图与最后一个测试集匹配。如果您将s
美元设置为可选:)检查此项:是的,我支持你这项操作不正确,因为它也将匹配123
。请澄清:你想不想捕获一百万美元和五百万美元?@Asunez,我不想捕获“一百万美元和五百万美元”。@DmitrySidenko但是。那有什么问题吗?你是否使用了re.findall
r正则表达式并得到奇怪的结果?我想创建一个简短的正则表达式句子,它得到33美元和33美元,而不是33美元。在一百万美元和五美元的例子中使用是我的错。它将出现在下一个任务中,并且与当前问题没有联系。谢谢你@第四只鸟的回答。它通过了我所有的测试
^(\$|\d+)(\s*)(\d+|dollar|dollars|\$)$