将f字符串与要在正则表达式中使用的原始字符串组合会产生SyntaxError; ValueError或错误的结果

问题描述 投票:0回答:1

我在这里有一个字符串:

s0 = 'Ready1   Origin1                 Destination1             Type1       Rate1      Phone1 #     Pro1 #'

以及以下变量是这样计算的:

is_head = len([i.group() for i in re.finditer(r"(\s+){2,}", s0)]) >= 3

这给了我True,对我来说是正确的预期结果。现在,我有另一个变量cont_,该变量可以保存26之间的任何值。我想基于r"(\s+){2,}"的值将正则表达式从r"(\s+){6,}"更改为cont_。我想获取变量is_head,而无需为每种情况声明单独的正则表达式。为此,我需要使用f字符串以及当前用于正则表达式检查的原始字符串。我尝试过这些:

>>> len([i.group() for i in re.finditer(fr"(\s+){{cont_},}", s0)]) >= 3
  File "<stdin>", line 1
SyntaxError: f-string: single '}' is not allowed
>>> len([i.group() for i in re.finditer(rf"(\s+){{cont_},}", s0)]) >= 3
  File "<stdin>", line 1
SyntaxError: f-string: single '}' is not allowed

如图所示,两者都给出SyntaxError。我还尝试了.format()

>>> len([i.group() for i in re.finditer(r"(\s+){{con},}".format(cont_), s0)]) >= 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Single '}' encountered in format string
>>> len([i.group() for i in re.finditer(r"(\s+){{0},}".format(cont_), s0)]) >= 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Single '}' encountered in format string

在那种情况下,我得到ValueError。现在我也尝试过这些:

>>> len([i.group() for i in re.finditer(fr"(\s+){cont_,}", s0)]) >= 3
False
>>> len([i.group() for i in re.finditer(rf"(\s+){cont_,}", s0)]) >= 3
False

这些不会产生任何错误,但在每种情况下都会给出错误的结果。如果以cont_ = 2情况运行,则is_head应该设置为True。进一步检查后,我发现rf"(\s+){cont_,}"fr"(\s+){cont_,}"都等同于'(\\s+)(2,)',这不应该是正确的正则表达式。如何克服此问题,而不必为cont_变量的每个可能值明确拥有单独的正则表达式,然后再使用该正则表达式。

NOTE:请注意,我知道在here之前曾问过类似的问题。但是解决方案对我的事业没有帮助。

python python-3.x regex python-3.7 f-string
1个回答
1
投票

(\s+){2,}模式匹配一个或多个空格两次或多次,这没有什么意义。两个或多个空格的块与\s{2,}匹配。

接下来,在f字符串或格式字符串中,字面大括号必须加倍。

因此,您需要

rf"\s{{{cont_},}}"

[第一个{{是文字{{cont_}代表cont_值,最后的}}是文字}字符。

© www.soinside.com 2019 - 2024. All rights reserved.