Python, Regexp: поместить список строк в регулярное выражение - PullRequest
0 голосов
/ 07 июня 2018

У меня есть регулярное выражение, которое идентифицирует строки в ценовом формате:

import re
price = re.compile(r'^.*[\$\£\€]\s?\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{1,2})?.*$')

Однако я хотел бы иметь функцию, которая может поместить список символов валюты в первый набор символов выше, ачем только три, которые я определил.Например,

import re
currencies = ['$', '£', '€']
key_characters = '|'.join(currencies)
price_re = re.compile(r'^.*[({})]\s?\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{1,2})?.*$')
word = re.compile(price_re.format(key_characters))

Когда я пытаюсь запустить последнюю функцию 'word', я получаю следующие ошибки:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: '1,3'

Когда я удаляю одно из двух чисел, перечисленных вышетретья строка Traceback меняется на:

ValueError: cannot switch from automatic field numbering to manual field specification

Есть ли способ сделать то, что я хотел бы?Это вопрос наличия избыточного «|»символы в наборе?

1 Ответ

0 голосов
/ 07 июня 2018

Вы не можете отформатировать объект регулярного выражения, вы должны сделать это со строкой.Затем вам нужно удвоить буквенные фигурные скобки, чтобы они могли быть проанализированы как буквальные { и }.Не используйте группу внутри [...], просто используйте [{}] в строке формата и join ключи с пустой строкой вместо |.

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

import re
currencies = ['$', '£', '€']
key_characters = ''.join(currencies)
price_re = re.compile(r'[{}]\s?\d{{1,3}}(?:[.,]\d{{3}})*(?:[.,]\d{{1,2}})?'.format(key_characters))
for m in price_re.findall(r'$13344,34, £3424, €7777'):
    print(m)

См. Демонстрационную версию Python .

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