lua*_*art 5 python regex backslash lookbehind
如何使用lookbehind断言在Python中匹配r'\a' ?
实际上,我需要匹配 C++ 字符串,例如"a \" b"and
"str begin \
end"
Run Code Online (Sandbox Code Playgroud)
我试过:
>>> 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
Run Code Online (Sandbox Code Playgroud)
真实示例:
当我"my s\"tr"; 5;像这样进行打包时ms = res.match(r'"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"
Run Code Online (Sandbox Code Playgroud)
编辑:最终的正则表达式是对单词对齐提供的正则表达式的改编
我认为您正在寻找这个正则表达式:
(?s)"(?:[^"\\]|\\.)*"
Run Code Online (Sandbox Code Playgroud)
请参阅regex101 上的演示。
Python 代码示例(在TutorialsPoint 上测试):
import re
p = re.compile(ur'(?s)"(?:[^"\\]|\\.)*"')
ms = p.match('"my s\\"tr"; 5;')
print ms.group(0)
Run Code Online (Sandbox Code Playgroud)