好的,我目前正在使用 Python 的正则表达式库将以下字符串拆分为多组以分号分隔的字段。
'key1:"这是一个测试短语"; key2:“这是另一个测试短语”; key3:“好的,这是一个陷阱\;但你应该明白它”;'
正则表达式:\s*([^;]+[^\\])\s*;
我目前正在使用上面的 pcre,它工作正常,直到我遇到一个转义分号包含在上面提到的 key3 短语中的情况。
如何修改此表达式以仅拆分非转义分号?
最佳答案
这个的基本版本是您要忽略任何以反斜杠开头的 ;
,而不管其他任何内容。这相对简单:
\s*([^;]*[^;\\]);
如果您希望将输入中的转义 反斜杠视为文字,这将变得棘手。例如:
"You may want to split here\\;"
"But not here\;"
如果这是你想要考虑的事情,试试这个(已编辑):
\s*((?:[^;\\]|\\.)+);
为什么这么复杂?因为如果允许转义反斜杠,那么您必须考虑这样的事情:
"0 slashes; 2 slashes\\; 5 slashes\\\\\; 6 slashes\\\\\\;"
每对双反斜杠将被视为文字 \
。这意味着 ;
只有在其前面有奇数 个反斜杠时才会被转义。所以上面的输入将像这样分组:
#1: '0 slashes'
#2: '2 slashes\'
#3: '5 slashes\\; 6 slashes\\\'
因此模式的不同部分:
\s* #Whitespace
((?:
[^;\\] #One character that's not ; or \
| #Or...
\\. #A backslash followed by any character, even ; or another backslash
)+); #Repeated one or more times, followed by ;
在反斜杠后要求一个字符可确保第二个字符始终正确转义,即使它是另一个反斜杠。
关于Python 正则表达式 : Ignore Escaped Character,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8435368/