Python 正则表达式 : Ignore Escaped Character

标签 python regex pcre

好的,我目前正在使用 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/

相关文章:

python - 从 matplotlib 中不同轴上的线更新 Line2D 属性

python - 当 mysql 和用户输入不相同时,标签提供错误的动态名称

Java 正则表达式 : can't figure out a solution

python - 如何使用python写入命令行

python - 是否可以将 C 库与 python AppEngine 一起使用?

php - 是否有可能找到与单个正则表达式重叠的匹配项?

php - 如果大于零则匹配数字

bash - 匹配以 grep 结尾的 unix 行

regex - 如何限制正则表达式中的字符外观?

javascript - 用于检测包含 URL 或文件扩展名的字符串的正则表达式