Python 包括行首在内的正则表达式否定回顾

Python regex negative lookbehind including start of line

考虑以下输入:

"aaa"|"bbb"|"123"|"!"\"|"2010-01-04T00:00:01"

我正在尝试编写一个正则表达式,如果...

在 PHP 中,我能够使下图所示的正则表达式正常工作...

由于 python 正则表达式的限制,同一正则表达式失败并出现以下错误:

re.error: look-behind requires fixed-width pattern

我的python代码如下:

import re
orig_line = r'"aaa"|"bbb"|"123"|"!"\"|"2010-01-04T00:00:01"'
new_line = re.sub(pattern='(?<!\||^)\"(?!\||$)',repl='~',string=orig_line)

如何调整此正则表达式使其在 python 中工作?

SO 上存在类似的问题,但我找不到任何解决 start/end 行要求的问题。

您可以使用

(?<=[^|])

(?<=[^|]) 匹配紧接在 | 之前的任何字符的位置,因此它不能匹配字符串的开头。

参见Python demo

import re
orig_line = '"aaa"|"bbb"|"123"|"!"\"|"2010-01-04T00:00:01"'
new_line = re.sub(r'(?<=[^|])"(?=[^|])', '~', orig_line)
print(new_line) # => "aaa"|"bbb"|"123"|"!~\"|"2010-01-04T00:00:01"

我会按照以下方式处理它:因为您对开始时没有的 " 感兴趣,我们可以将其表示为 之前有一个非换行符,即使用正向后视:

import re
orig_line = r'"aaa"|"bbb"|"123"|"!"\"|"2010-01-04T00:00:01"'
new_line = re.sub(pattern='(?<=.)(?<!\|)\"(?!\||$)',repl='~',string=orig_line)
print(new_line)

输出:

"aaa"|"bbb"|"123"|"!~\"|"2010-01-04T00:00:01"

如果您不限于 python 标准库,我建议您尝试 regex,它确实支持可变长度后视,例如:

import regex as re
text = "a1aa2aaa3aaaa4"
print(re.findall('(?<=a{3,})[0-9]', text))

输出:

['3', '4']