Как создать регулярное выражение для валюты доллар? - PullRequest
1 голос
/ 17 июня 2019

Я хочу создать регулярное выражение для валюты доллара. Эти примеры следует искать по регулярному выражению:

$ 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))

Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 17 июня 2019

Вы можете использовать

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) - граница слова без предшествующего пробела.
1 голос
/ 17 июня 2019

Вероятно, самый простой способ добиться этого - создать несколько альтернатив:

(\$\s*\d+|\d+\s*\$|\d+\s+dollars|1 dollar)

Смотрите это в действии здесь: https://regex101.com/r/sAiDOo/2

Это тривиальный подход, но он прекрасно работает. Заключение в скобки может не потребоваться в зависимости от вашего варианта использования.

Пояснение:

У нас есть 4 отдельные опции, все разделены | (труба).

  1. \$\s*\d+: найдите знак доллара (не забудьте его избежать!), За которым следует любое количество пробелов (*: 0 или более), за которыми следует хотя бы одна цифра (+: 1 или более )
  2. \d+\s*\$: то же самое, только наоборот: найдите хотя бы одну цифру, затем любое количество пробелов и знак доллара.
  3. \d+\s+dollars: найдите хотя бы одну цифру, за которой следует хотя бы один пробел, за которым следует слово доллары.
  4. 1 dollar: Поиск точной строки 1 dollar, поскольку она не будет соответствовать dollars (множественное число).
0 голосов
/ 17 июня 2019

Я согласен с @christoph но его можно сократить, если подумать иначе

^(\$|\d+)(\s*)(\d+|dollar|dollars|\$)$

Посмотри в действии - https://regex101.com/r/IWnHni/1

Пояснение

  1. Первая группа (скобка) говорит нам, что может стоять на первом месте, т. Е. $ Или цифра
  2. Вторая группа для пространства
  3. Третья группа сообщает нам, что может идти после пробела, т. Е. $ Или доллар, или доллары, или цифра

Надеюсь, это поможет

0 голосов
/ 17 июня 2019

Другой вариант использования вашего чередования может быть следующим:

(?:\$\s*\d+|\d+\s*(?:\$?usd|\$|dollars?|bucks))

Пояснение

  • (?: Группа без захвата
    • \$\s*\d+ Совпадение со знаком доллара, 0+ раз, символ пробела и 1+ цифр
    • | Или
    • \d+\s* Совпадение 1+ цифр с последующими 0+ пробелами
    • (?: Группа без захвата
      • \$?usd|\$|dollars?|bucks Соответствует любому из вариантов, где \$? - необязательный знак доллара
    • ) Закрыть группу без захвата
  • ) Закрыть группу без захвата

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...