我想为美元货币创建一个正则表达式。这个例子应该通过正则表达式找到:
$ 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*(?:$?usd|$|dollars?|bucks))
解释
-
(?:
非捕获组-
$s*d+
匹配美元符号,0+ 乘以空格字符和 1+ 位数字 -
|
或 -
d+s*
匹配 1+ 数字后跟 0+ 空格字符 -
(?:
非捕获组-
$?usd|$|dollars?|bucks
匹配$?
为可选美元符号的任何选项
-
-
)
关闭非捕获组
-
-
)
关闭非捕获组
正则表达式演示
实现此目的的最简单方法可能是创建多个替代方案:
($s*d+|d+s*$|d+s+dollars|1 dollar)
在这里看到它的实际应用: https://regex101.com/r/sAiDOo/2
这是微不足道的方法,但它效果很好。根据您的使用案例,可能不需要换行括号。
解释:
我们有 4 个单独的选项可用,所有选项都由|
(管道(隔开。
-
$s*d+
:搜索美元符号(记住要转义!(,后跟任意数量的空格(*
:0或更多(,后跟至少一个数字(+
:1或更多( -
d+s*$
:同样的事情,只是相反:搜索至少一个数字,后跟任意数量的空格,后跟一个美元符号。 -
d+s+dollars
:搜索至少一个数字,后跟至少一个空格,后跟单词美元。 -
1 dollar
:搜索确切的字符串1 dollar
,因为它不会与dollars
(复数s(匹配。
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))
在线观看 Python 演示。输出:
['$ 10']
['10$']
['10 $']
['1000005 dollars']
['dollars one million and five']
将数字匹配为单词的正则表达式部分是
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)
- 不跟空格的单词边界 -
(?:s|[a-]|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)+
- 1次或多次重复空格,a
,-
,zero
,...,nine
,ten
,eleven
,twelve
...,twenty
,hundred
,thousand
,million
和billion
-
b(?<!s)
- 前面没有空格的单词边界。
我同意@christoph但它可以通过反过来思考来缩短
^($|d+)(s*)(d+|dollar|dollars|$)$
看到它的实际效果 - https://regex101.com/r/IWnHni/1
解释
- 第一组(括号(告诉我们什么可以排在第一位,即 $ 或数字
- 第二组用于空间
- 第三组告诉我们空间之后会发生什么,即美元或美元或美元或数字
希望这有帮助