将 f-string 与要在 regex 中使用的原始字符串组合会产生 SyntaxError; ValueError 或错误的结果
Combining f-string with raw string to be used inside regex gives SyntaxError; ValueError or wrong result
我这里有一个字符串:
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
之间的任何值。我想根据 cont_
的值将正则表达式从 r"(\s+){2,}"
更改为 r"(\s+){6,}"
。我想获取变量 is_head
而无需为每种情况声明单独的正则表达式。为此,我需要将 f-string 与当前用于正则表达式检查的原始字符串一起使用。我试过这些:
>>> 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_
变量的每个可能值明确设置单独的正则表达式并随后使用该正则表达式的情况下克服这个问题。
注意:请注意,我知道在 之前有人问过类似的问题。但是那里的解决方案对我的事业没有帮助。
(\s+){2,}
模式匹配一个或多个 空格两次或更多次,这毫无意义。两个或多个空格的块与 \s{2,}
匹配。
接下来,在 f 字符串或格式字符串中,文字花括号必须加倍。
因此,您需要
rf"\s{{{cont_},}}"
其中第一个 {{
是文字 {
,{cont_}
代表 cont_
值,最后的 }}
是文字 }
字符。
我这里有一个字符串:
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
之间的任何值。我想根据 cont_
的值将正则表达式从 r"(\s+){2,}"
更改为 r"(\s+){6,}"
。我想获取变量 is_head
而无需为每种情况声明单独的正则表达式。为此,我需要将 f-string 与当前用于正则表达式检查的原始字符串一起使用。我试过这些:
>>> 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_
变量的每个可能值明确设置单独的正则表达式并随后使用该正则表达式的情况下克服这个问题。
注意:请注意,我知道在
(\s+){2,}
模式匹配一个或多个 空格两次或更多次,这毫无意义。两个或多个空格的块与 \s{2,}
匹配。
接下来,在 f 字符串或格式字符串中,文字花括号必须加倍。
因此,您需要
rf"\s{{{cont_},}}"
其中第一个 {{
是文字 {
,{cont_}
代表 cont_
值,最后的 }}
是文字 }
字符。