Python正则表达式 - 匹配一个角色而不消耗它

时间:2013-11-21 10:20:04

标签: python regex

我想转换以下字符串

"For "The" Win","Way "To" Go"

"For ""The"" Win","Way ""To"" Go"

直截了当的正则表达式是

str2 = re.sub(r'(?<!,|^)"(?=\w)|(?<=\w)"(?!,|$)', '""', str1,flags=re.MULTILINE)

即,将引号加倍

  1. 后跟一个字母,但后面没有逗号或行首
  2. 在一封信之前,但后面没有逗号或行尾
  3. 问题是我使用的是python,它的正则表达式引擎不允许在lookbehind结构中使用OR运算符。我收到了错误

      

    sre_constants.error:look-behind需要固定宽度模式

    我正在寻找的是一个正则表达式,它将用'"'替换'The'和'To'周围的'""'。 我可以使用以下正则表达式(提供给another question的答案)

    \b\s*"(?!,|[ \t]*$)
    

    但是消耗了'The'和'To'之前的空间,我得到了下面的

    "For""The"" Win","Way""To"" Go"

    是否有一种解决方法,以便我可以将'The'和'To'的引号加倍,而不占用它们之前的空格?

5 个答案:

答案 0 :(得分:2)

不是说前面没有逗号或行开头,而是先写一个非逗号字符:

r'(?<=[^,])"(?=\w)|(?<=\w)"(?!,|$)'

答案 1 :(得分:2)

在我看来你不需要打扰锚。

  • 如果引号前有一个字符,则表示它不在字符串的开头。
  • 如果该字符不是换行符,则表示您不在行的开头。
  • 如果该字符不是逗号,则表示您不在字段的开头。

所以你不需要使用锚点,只需为一个角色做一个积极的lookbehind / lookahead:

result = re.sub(r'(?<=[^",\r\n])"(?=[^,"\r\n])', '""', subject)

我向"提出了可能有一些已经转义的报价的可能性。但实际上,如果是这样的话,你可能还是搞砸了。 ;)

答案 2 :(得分:1)

re.sub(r'\b(\s*)"(?!,|[ \t]*$)', r'\1""', s)

答案 3 :(得分:1)

每当遇到此问题时,最直接的解决方法是:将后视镜片分成两个后视镜片。

str2 = re.sub(r'(?<!,)(?<!^)"(?=\w)|(?<=\w)"(?!,|$)', '""', str1,flags=re.MULTILINE)

(不要将字符串命名为str

答案 4 :(得分:0)

str2 = re.sub('(?<=[^,])"(?=\w)'
              '|'
              '(?<=\w)"(?!,|$)',

              '""',  ss,
              flags=re.MULTILINE)

我总是想知道为什么人们在不需要时使用原始字符串来制作正则表达式。

注意我将str内置类的名称更改为ss

对于'&#34;有趣&#34; :

str2 = re.sub('"'
              '('
              '(?<=[^,]")(?=\w)'
              '|'
              '(?<=\w")(?!,|$)'
              ')',

              '""', ss,
              flags=re.MULTILINE)

str2 = re.sub('(?<=[^,]")(?=\w)'
              '|'
              '(?<=\w")(?!,|$)',

              '"',  ss,
              flags=re.MULTILINE)