Вы можете использовать
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)
- граница слова без предшествующего пробела.