python的括号嵌套字符串匹配问题

python的括号嵌套字符串匹配问题

首先,先简述一下我遇到的问题:

  • 在做新闻页面爬虫时,所获得数据是如下的一串字符,其json字符串位于artiList()当中,所以我的目的表是将json数据通过
    python的正则表达式提取出来

artiList({“BD29LPUBwangning”:[{“liveInfo”:null,“docid”:“E9RB5B5V0001875N”,“source”:“中国新闻网”,“title”:“钟山:民营企业已经成为中国对外>贸易的主力军”,“priority”:60,“hasImg”:1,“url”:“http:/3g.163.com/news/19/0309/15/E9RB5B5V0001875N.html”,“commentCount”:0,“imgsrc3gtype”:“1”,“stitle”:"",“digest”:“中新社北京3月9日电中国商务部部长钟山9日在北京表示,今年将”,“imgsrc”:“http:/cms-bucket.ws.126.net/2019/03/09/2adcf4582d8d4f0b8d0da5c781b49cb0.png”,“ptime”:“2019-03-09 15:48:12”}]})

首先,我直接使用

   re.findall(r'[(](.*?)[)]', string)

可以正常提取,但是一旦字符里出现(),则提取失败,如:

(中国)商务部部长钟山9日在(北京)表示

上述代码只能匹配到第一个" ) "就停止了

经过改进

   p1 = re.compile(r'[(](.*)[)]', re.S)
   string1 = re.findall(p1, string)

或者是

   re.findall('(?<=\().*(?, string)

如上代码可以成功实现需求。

解释一下:

  1. 正则匹配串前加了r就是为了使得里面的特殊符号不用写反斜杠了。

  2. [ ]具有去特殊符号的作用,也就是说 [(] 里的 ( 只是平凡的括号

  3. 正则匹配串里的()是为了提取整个正则串中符合括号里的正则的内容

  4. .是为了表示除了换行符的任一字符。*克林闭包,出现0次或无限次。

  5. 加了?是最小匹配,不加是贪婪匹配。

  6. re.S是为了让.表示除了换行符的任一字符。

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

  1. JavaScript正则表达式在线测试工具:
    http://tools.jb51.net/regex/javascript

  2. 正则表达式在线生成工具:
    http://tools.jb51.net/regex/create_reg

你可能感兴趣的:(python的括号嵌套字符串匹配问题)