由于长度可变

时间:2016-06-14 16:35:27

标签: regex python-3.x lookbehind

我使用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
>>> 

我可以用什么来克服这个限制?

2 个答案:

答案 0 :(得分:2)

使用多行标记,这会导致^$分别匹配每行的开头和结尾,从而使你的正则表达式只是:

^

答案 1 :(得分:2)

由于\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 接受可变宽度的后视模式。