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。
我有一个识别价格格式字符串的正则表达式:
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。