我想从以下字符串中提取变量(即用“”包围的名称)
案例1:
string = r"RESPONSE(1, -2.532 + 0.779*(LN('Loss_Ratio')) +SELECT(INDEX_FIRST_TRUE('POL_Zero'="No"),2.261,0.0) +SELECT(INDEX_FIRST_TRUE('POL_children'="Si"),0.307,0.0))"
当我申请时
all_variables = list(set(re.findall("'([^']*)'", string)))
我得到了正确的结果:
all_variables = ['Loss_Ratio','POL_Zero','POL_children']
但情况 2(当POL_Zero 模态发生变化时)
string = r"RESPONSE(1, -2.532 + 0.779*(LN('Loss_Ratio')) +SELECT(INDEX_FIRST_TRUE('POL_Zero'="Nos' conditional"),2.261,0.0) +SELECT(INDEX_FIRST_TRUE('POL_children'="Si"),0.307,0.0))"
相同的正则表达式会产生错误的结果。在 case2 中如何仍然获得正确的结果?
请注意名称中不能有单引号或双引号。
最佳答案
您可以利用单引号字符串既不能包含单引号也不能包含双引号的事实。
仅在这种情况下,
"""'([^"']*)'"""
正则表达式将按预期工作。请参阅the regex demo .
这里,
'
- 匹配单引号([^"']*)
- 第 1 组(如果您使用re.findall',则只有这部分会出现在输出中):零个或多个 (
*)
"和
'(
[^'"]`)以外的字符'
- 结束单引号。
import re
s = """RESPONSE(1, -2.532 + 0.779*(LN('Loss_Ratio')) +SELECT(INDEX_FIRST_TRUE('POL_Zero'="No"),2.261,0.0) +SELECT(INDEX_FIRST_TRUE('POL_children'="Si"),0.307,0.0))
RESPONSE(1, -2.532 + 0.779*(LN('Loss_Ratio')) +SELECT(INDEX_FIRST_TRUE('POL_Zero'="Nos' conditional"),2.261,0.0) +SELECT(INDEX_FIRST_TRUE('POL_children'="Si"),0.307,0.0))"""
print(re.findall(r"""'([^"']*)'""", s))
# => ['Loss_Ratio', 'POL_Zero', 'POL_children', 'Loss_Ratio', 'POL_Zero', 'POL_children']
关于python - 如何使用 python 正则表达式避免特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47137391/