Python、正则表达式:将字符串列表放入正则表达式中

Python, Regexp: Place list of strings in regex

我有一个识别价格格式字符串的正则表达式:

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

有没有办法做我想做的事?是否有多余的'|'集合中的字符?

您不能格式化正则表达式对象,您应该使用字符串来格式化。然后,您需要加倍文字大括号,以便将它们解析为文字 {}。不要在 [...] 中使用组,只需在格式字符串中使用 [{}]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'344,34, £3424, €7777'):
    print(m)

参见Python demo