正则表达式匹配[^'],但也匹配字符串中的\'

时间:2015-06-26 19:33:01

标签: python sql regex parsing

我正在解析.SQL文件并尝试将其写入Mongodb。

我使用了这个正则表达式,

\((\d+),'([^']+)'(?:,(\d+))(?:,(\d+))(?:,(\d+))\)

,它适用于大多数情况。

(431532,'Fluorescent_cheese_dyes',0,0,0),(431533,'Christian_Rock_albums',0,0,0),
(431534,'Variety_radio_stations',0,0,0),(431535,'Dean\'s_list',0,0,0),

但是最后一个案例没有关于\'的位置,因为我用'([^']+)'来匹配字符串。当我将'([^']+)'更改为'((?:(?:\')|[^'])+)'时,它将匹配一个实例中的所有案例而不是4.这些组将如下所示:

1.  431532
2.  Fluorescent_cheese_dyes',0,0,0),(431533,'Christian_Rock_albums',0,0,0),(431534,'Variety_radio_stations',0,0,0),(431535,'Dean\'s_list
3.  0
4.  0
5.  0

如何处理此问题,第二组将字符串与\'匹配?

3 个答案:

答案 0 :(得分:2)

只需使用非贪婪的..+?

\((\d+),'(.+?)'(?:,(\d+))(?:,(\d+))(?:,(\d+))\)

示例:https://regex101.com/r/zV0lZ1/1

答案 1 :(得分:0)

我建议将'([^']+)'替换为'(([^']|\\')+)'

字符串被单引号括起来。它包含一个或多个实例:

  • 除单引号外的字符,或
  • 单引号被一个反斜杠转义

答案 2 :(得分:0)

看起来您必须考虑报价中的任何转义。

 # \((\d+),'((?:\\[\S\s]|[^'\\])*)'(?:,(\d+))(?:,(\d+))(?:,(\d+))\)

 \(
 ( \d+ )                             # (1)
 ,
 '
 (                                   # (2 start)
      (?: \\ [\S\s] | [^'\\] )*
 )                                   # (2 end)
 '
 (?:
      ,
      ( \d+ )                        # (3)
 )
 (?:
      ,
      ( \d+ )                        # (4)
 )
 (?:
      ,
      ( \d+ )                        # (5)
 )
 \)