我想为美元货币创建一个正则表达式。 该示例可以通过正则表达式找到:
$ 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))
我该怎么做?
答案 0 :(得分:1)
可能最简单的方法是创建多个选择:
(\$\s*\d+|\d+\s*\$|\d+\s+dollars|1 dollar)
在此处查看实际操作:https://regex101.com/r/sAiDOo/2
这是微不足道的方法,但效果很好。根据您的使用情况,可能不需要使用括号。
说明:
我们有4个单独的选项,所有选项都由|
(竖线)分隔。
\$\s*\d+
:搜索一个美元符号(记住要转义!),后跟任意数量的空格(*
:0或更多),然后至少一个数字({{1 }}:1个或更多)+
:同样,反之亦然:搜索至少一位数字,后跟任意数量的空格,后跟一个美元符号。\d+\s*\$
:搜索至少一个数字,然后至少搜索一个空格,然后再搜索单词。\d+\s+dollars
:搜索确切的字符串1 dollar
,因为1 dollar
(复数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))
请参见Python demo online。输出:
['$ 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)
请参见this regex demo。详细信息:
\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)
-不带空格的单词边界。答案 2 :(得分:0)
使用您的轮换方式的另一个选择可能是:
(?:\$\s*\d+|\d+\s*(?:\$?usd|\$|dollars?|bucks))
说明
(?:
非捕获组
\$\s*\d+
匹配一个美元符号,0 +倍空白字符和1+个数字|
或\d+\s*
匹配1+个数字,后跟0+个空格字符(?:
非捕获组
\$?usd|\$|dollars?|bucks
匹配其中\$?
是可选美元符号的任何选项)
关闭非捕获组)
关闭非捕获组答案 3 :(得分:0)
我同意@christoph 但可以通过其他方式思考来缩短它
^(\$|\d+)(\s*)(\d+|dollar|dollars|\$)$
查看实际效果-https://regex101.com/r/IWnHni/1
说明
希望这会有所帮助