组引号并忽略转义引号

2024-04-20 04:53:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用(['\"])(?:\\1|.*?\\1)捕获一组引号。你知道吗

Text: "Hello", is it 'me youre looking for'?
# result: "Hello" (\1) and 'me youre looking for' (\2)

此外,我希望它忽略这些组中的转义引号(或者全局,也可以)。你知道吗

Text: "Hello", is it 'me you\'re looking for'?
# result: "Hello" (\1) and 'me you\'re looking for' (\2)

使用python。我知道this questions有点类似。但是,我无法将其应用于现有的正则表达式。你知道吗

谢谢,regex怪胎!你知道吗


Tags: andtextreyouhelloforisit
2条回答

你可以使用下面的正则表达式。你知道吗

(?<!\\)(['"])(?:\\\1|(?!\1).)*\1

DEMO

  • (?<!\\)负的lookback,断言匹配不会以反斜杠字符开头。

  • (['"])这将捕获未转移的单引号或双引号。

  • (?:\\\1|(?!\1).)*\\\1这将基于捕获的字符或任何字符(而不是捕获的字符)匹配转义的'"引号,零次或多次。

  • \1引用第一个捕获的字符。

在python中,您需要修改re.findall函数,如下所示。你知道吗

>>> def match(s):
        for i in re.findall(r'''(?<!\\)((['"])(?:\\\2|(?!\2).)*\2)''', s):
            print(i[0])


>>> match(r""""Hello", is it 'me you\'re looking for'""")
"Hello"
'me you\'re looking for'
>>> match(r"""Hello\", is it 'me you\'re looking for'""")
'me you\'re looking for'
>>> 

这里有一个模式:

(['"])(?:\\.|.)*?\1

Demo

一切都在(?:\\.|.)位:

  • 匹配转义字符:\\.-这同时处理\"\\
  • 或者任何其他(读:unescaped)字符:.-您也可以在这里使用[^\\]。你知道吗

由于正则表达式引擎尝试从左到右的交替,它将首先尝试匹配转义字符。你知道吗

顺便说一下,在您的模式中,\1|.*?\1是多余的,您可以编写.*?\1。你知道吗

相关问题 更多 >