首页 > 解决方案 > Python,正则表达式:在正则表达式中放置字符串列表

问题描述

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

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

当我尝试运行最终的“单词”函数时,出现以下错误:

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

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

标签: pythonregexpython-3.xvalueerror

解决方案


你不能格式化一个正则表达式对象,你应该用一个字符串来做。然后,您需要将文字花括号加倍,以便它们可以被解析为文字{}. 不要在里面使用组[...],只[{}]在格式字符串和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 演示


推荐阅读