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

Ark*_*tev 4 python regex python-3.x f-string python-3.7

我这里有一个字符串:

s0 = 'Ready1   Origin1                 Destination1             Type1       Rate1      Phone1 #     Pro1 #'
Run Code Online (Sandbox Code Playgroud)

以下变量的计算如下:

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

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

如图所示,两者都给出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
Run Code Online (Sandbox Code Playgroud)

在那种情况下我得到了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
Run Code Online (Sandbox Code Playgroud)

这些不会产生任何错误,但在每种情况下都会给出错误的结果。如果我运行cont_ = 2案例,is_head就会被设置True。经过进一步检查,我可以看到- 两者都相当于rf"(\s+){cont_,}"which不应该是正确的正则表达式。如何克服这个问题,而无需为变量的每个可能值明确使用单独的正则表达式,然后使用该正则表达式。fr"(\s+){cont_,}"'(\\s+)(2,)'cont_

注意:请注意,我知道以前曾在这里提出过类似的问题。但那里的解决方案对我的事业没有任何帮助。

Wik*_*żew 5

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

接下来,在 f 字符串或格式字符串中,文本大括号必须是双的。

因此,你需要

rf"\s{{{cont_},}}"
Run Code Online (Sandbox Code Playgroud)

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