Python 包括行首在内的正则表达式否定回顾
Python regex negative lookbehind including start of line
考虑以下输入:
"aaa"|"bbb"|"123"|"!"\"|"2010-01-04T00:00:01"
我正在尝试编写一个正则表达式,如果...
- 它之前或之后都没有分隔符
|
AND
- 它不在行首 AND
- 不在行尾
在 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']
考虑以下输入:
"aaa"|"bbb"|"123"|"!"\"|"2010-01-04T00:00:01"
我正在尝试编写一个正则表达式,如果...
- 它之前或之后都没有分隔符
|
AND - 它不在行首 AND
- 不在行尾
在 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']