我在这里有一个字符串:
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_
,该变量可以保存2
至6
之间的任何值。我想基于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之前曾问过类似的问题。但是解决方案对我的事业没有帮助。
(\s+){2,}
模式匹配一个或多个空格两次或多次,这没有什么意义。两个或多个空格的块与\s{2,}
匹配。
接下来,在f字符串或格式字符串中,字面大括号必须加倍。
因此,您需要
rf"\s{{{cont_},}}"
[第一个{{
是文字{
,{cont_}
代表cont_
值,最后的}}
是文字}
字符。