>> res = re.compil-6ren">
gpt4 book ai didi

python - 如何在 Python 后向断言正则表达式 (?<=\\) 中使用 '\' 来匹配类似 C++ 的带引号字符串

转载 作者:太空狗 更新时间:2023-10-30 03:00:17 26 4
gpt4 key购买 nike

如何使用后向断言在 Python 中匹配 r'\a'
实际上,我需要匹配 C++ 字符串,例如 "a\"b"

"str begin \
end"

我试过:

>>> res = re.compile('(?<=\)a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/re.py", line 190, in compile
return _compile(pattern, flags)
File "/usr/lib/python2.7/re.py", line 244, in _compile
raise error, v # invalid expression

>>> res = re.compile('(?<=\\)a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/re.py", line 190, in compile
return _compile(pattern, flags)
File "/usr/lib/python2.7/re.py", line 244, in _compile
raise error, v # invalid expression
sre_constants.error: unbalanced parenthesis

>>> res = re.compile('(?<=\\\)a')
>>> ms = res.match(r'\a')
>>> ms is None
True

实例:
当我像 ms = res.match(r'"my s\"tr"; 5;') 那样解析 "my s\"tr"; 5; ,预期的输出是:"my s\"tr"

回答
最后 stribizhev 提供了解决方案。我认为我最初的正则表达式的计算成本较低,唯一的问题是它应该使用原始字符串声明:

>>> res = re.compile(r'"([^\n"]|(?<=\\)["\n])*"', re.UNICODE)
>>> ms = res.match(r'"my s\"tr"; 5;')
>>> print ms.group()
"my s\"tr"

最佳答案

假设源代码编译,这是在 C 和 C++ 中匹配常规字符串文字的经典解决方案,同时考虑了行继续语法:

(?s)"(?:[^"\\\n]|\\.)*"

回想起来,因为我已经假设源代码可以编译,所以没有必要防止在 [^"\\\n] 中不属于行继续语法一部分的杂散新行。 , 所以只使用 [^"\\]也可以。

上面的正则表达式正确匹配了以下所有测试用例:

"a \" b"

"a \
b"

"\\"

"\\\
kjsh\a\b\tdfkj\"\\\\\\"

"kjsdhfksd f\\\\"

"kjsdhfksd f\\\""

Demo on regex101

stribizhev 的旧答案 (?s)((?<!\\)".+?(?<!(?<!\\)\\)")无法匹配 "kjsdhfksd f\\\"" 的有效大小写,并添加更多的后视只解决了有限数量的问题 \ .

许多连续的可能性\在字符串文字的一行中是这样的正则表达式不起作用的原因,也是我们不应该使用拆分操作来标记带引号字段的 CSV 的原因。

关于python - 如何在 Python 后向断言正则表达式 (?<=\\) 中使用 '\' 来匹配类似 C++ 的带引号字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29936568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com