由于长度可变,RegEx 后视“(?<=\n|\A)”不起作用
RegEx look-behind '(?<=\n|\A)' does not work because of variable length
我使用 Python (3) 并需要一个匹配字符串开头或换行符后的正则表达式。
我必须添加 re.DOTALL
标志,因为我需要一次处理多行。这里的例子只是简化了。
我想到的是这个回顾:
(?<=\n|\A)start of line
我在它工作的地方on regex101.com测试了它,但是运行它在我的Python 3.5控制台中导致了这个错误回溯:
$ python3
Python 3.5.1+ (default, Mar 30 2016, 22:46:26)
[GCC 5.3.1 20160330] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.search(r'(?<=\n|\A)start of line', 'just any text to test', re.DOTALL)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/re.py", line 173, in search
return _compile(pattern, flags).search(string)
File "/usr/lib/python3.5/re.py", line 293, in _compile
p = sre_compile.compile(pattern, flags)
File "/usr/lib/python3.5/sre_compile.py", line 540, in compile
code = _code(p, flags)
File "/usr/lib/python3.5/sre_compile.py", line 525, in _code
_compile(code, p.data, flags)
File "/usr/lib/python3.5/sre_compile.py", line 158, in _compile
raise error("look-behind requires fixed-width pattern")
sre_constants.error: look-behind requires fixed-width pattern
>>>
我可以用什么来克服这个限制?
使用多行标志,这会导致 ^
和 $
分别匹配行的每个开头和结尾,从而使您的正则表达式只是:
^
因为 \A
不是字符,所以错误消息是有道理的。
试试这个
re.search(r'^start of line', 'just any text to test', re.MULTILINE)
DOTALL 仅在您在正则表达式中使用 .
时才相关。
也许 regex101 使用第三方 regex 包而不是标准库中的 re。
>>> import regex
>>> regex.search(r'(?<=\n|\A)line', 'test\nline')
<regex.Match object; span=(5, 9), match='line'>
如您所见,regex 接受可变宽度的后视模式。
我使用 Python (3) 并需要一个匹配字符串开头或换行符后的正则表达式。
我必须添加 re.DOTALL
标志,因为我需要一次处理多行。这里的例子只是简化了。
我想到的是这个回顾:
(?<=\n|\A)start of line
我在它工作的地方on regex101.com测试了它,但是运行它在我的Python 3.5控制台中导致了这个错误回溯:
$ python3
Python 3.5.1+ (default, Mar 30 2016, 22:46:26)
[GCC 5.3.1 20160330] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.search(r'(?<=\n|\A)start of line', 'just any text to test', re.DOTALL)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/re.py", line 173, in search
return _compile(pattern, flags).search(string)
File "/usr/lib/python3.5/re.py", line 293, in _compile
p = sre_compile.compile(pattern, flags)
File "/usr/lib/python3.5/sre_compile.py", line 540, in compile
code = _code(p, flags)
File "/usr/lib/python3.5/sre_compile.py", line 525, in _code
_compile(code, p.data, flags)
File "/usr/lib/python3.5/sre_compile.py", line 158, in _compile
raise error("look-behind requires fixed-width pattern")
sre_constants.error: look-behind requires fixed-width pattern
>>>
我可以用什么来克服这个限制?
使用多行标志,这会导致 ^
和 $
分别匹配行的每个开头和结尾,从而使您的正则表达式只是:
^
因为 \A
不是字符,所以错误消息是有道理的。
试试这个
re.search(r'^start of line', 'just any text to test', re.MULTILINE)
DOTALL 仅在您在正则表达式中使用 .
时才相关。
也许 regex101 使用第三方 regex 包而不是标准库中的 re。
>>> import regex
>>> regex.search(r'(?<=\n|\A)line', 'test\nline')
<regex.Match object; span=(5, 9), match='line'>
如您所见,regex 接受可变宽度的后视模式。