两个非常相似的正则表达式,其他找不到匹配项

时间:2018-11-02 08:45:28

标签: python regex python-2.7

我正在尝试从JSON字符串匹配shortName字段(不再使用正确的JSON格式,因此不再使用正则表达式)。 在这里运行regex可能不是最有效的方法。我愿意征求意见,但我也希望解决原始问题。

我正在使用Python 2.7和Scrapy,运行PyCharm 2018.2

我想要的东西: 从充满餐厅的巨大JSON'ish文件中获取匹配项,将每个匹配项运行到列表中,遍历列表对象并收集不同的字段数据,我将这些数据设置为变量以备将来使用。不过,我们在这里没有走那么远。

我想匹配shortName字段,并从中提取值/数据。

下面的代码示例从已经接收到大文件(以unicode或字符串形式)的位置开始,我们开始匹配餐厅特定的数据字段。在实际模式中,我尝试转义而不是转义“和:符号。

我所拥有的: Regex101(下)

我得到了要修复的实际正则表达式,结果以“ NoneType没有属性'group'”结尾。

请注意,第一行“模式”有效,并为我带来了开始在for循环中通过的数据。我不认为问题出在这里。

regex = re.compile(pattern, re.MULTILINE)
for match in regex.finditer(r.text):
  restaurant = match.group()
  restaurant = str(restaurant)
  print restaurant
  print type(restaurant)

  name = re.search(r'(?<=shortName\":\")(.*?)(?=\")',restaurant,re.MULTILINE 
  | re.DOTALL).group()

源示例:

156,"mainGroupId":1,"menuTypeId":1,"shopExternalId":"0001","displayName":"Lorem Ipsum","shortName":"I WANT THIS TEXT HERE","streetAddress":"BlankStreet 5","zip":"1211536","city":"Wonderland",

测试正则表达式,适用于固定源示例。 注意:此示例的源示例由regex101格式化为\,因为我首先使用“和:转义了”。 我直接从他们的代码生成器复制了此代码,但它确实可以在代码中工作:

testregex = r'(?<=shortName\"\:\")(.*?)(?=\")'

test_str = (


156,\"mainGroupId\":1,\"menuTypeId\":1,\"shopExternalId\":\"0001\",\"displayName\":\"Lorem Ipsum\",\"shortName\":\"I CAN GET THIS MATCHED \",\"streetAddress\":\"BlankStreet 6\",\"zip\":\"2136481\",\"city\":\"Wonderland\")

matches = re.search(testregex, test_str, re.MULTILINE | re.DOTALL).group()
print matches
restaurantname = matches

出了什么问题: 上部的正则表达式打印出“'nonetype'对象没有属性'group'” -error。 较低的正则表达式为我获取了我想要的数据,在此示例中,它打印出“我可以匹配”

我很清楚,可能有一些小的语法问题,因为我已经尝试了一段时间。

先谢谢您。答案越详细越好。如果您对问题有不同的解决方法,请提供代码,以便我学习。

1 个答案:

答案 0 :(得分:2)

您的regex与您的字符串不匹配。输入中没有shopID

您可以使用以下正则表达式通过一个re.findall电话直接获得所有餐厅名称:

shortName":"([^"]+)

请参见regex demo详细信息

  • shortName":"-文字子字符串
  • ([^"]+)-捕获组1(re.findall调用的结果将是捕获到该组中的子字符串):1个或多个除"以外的字符。

请参见Python demo

import re
regex = re.compile(r'shortName":"([^"]+)')
print(regex.findall('156,"mainGroupId":1,"menuTypeId":1,"shopExternalId":"0001","displayName":"Lorem Ipsum","shortName":"I WANT THIS TEXT HERE","streetAddress":"BlankStreet 5","zip":"1211536","city":"Wonderland",'))