Python,Regexp:在regex中放置字符串列表

时间:2018-06-07 13:56:27

标签: python regex python-3.x valueerror

我有一个正则表达式,用于标识价格格式的字符串:

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 :(得分:1)

您不能格式化正则表达式对象,您应该使用字符串。然后,您需要将文字花括号加倍,以便将它们解析为文字{}。不要在[...]内使用群组,只需在格式字符串中使用[{}],在join中使用空字符串而不是|

您可以使用

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

请参阅https://github.com/spring-projects/spring-security-oauth/issues/938