【发布时间】:2018-11-02 08:45:27
【问题描述】:
我正在尝试匹配 JSON'ish 字符串中的短名称字段(不再是正确的 JSON 格式,因此是正则表达式)。 在这里运行正则表达式可能不是最有效的方法。我愿意接受建议,但我也希望找到原始问题的解决方案。
我正在使用 Python 2.7 和 Scrapy,运行 PyCharm 2018.2
我想要什么: 从包含餐馆的巨大 JSON'ish 文件中获取匹配项,将每个匹配项运行到列表中,迭代列表对象并收集不同的字段数据,我将其设置为变量以供将来使用。不过,我们不会走那么远。
我想匹配短名称字段,并从中提取值/数据。
下面的代码示例从已经接收到大文件的点开始(以 unicode 或字符串形式),我们开始匹配餐厅特定的数据字段。在实际模式中,我尝试转义,而不是转义“和:”符号。
我有什么: Regex101(下)
我得到了我正在尝试修复的实际正则表达式,结果是“NoneType has no attribute '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' object has no attribute 'group'"-错误。 较低的正则表达式让我得到我想要的数据,在这个例子中它打印出“我可以得到这个匹配”
我很清楚可能存在一些小的语法问题,因为我已经尝试修复了一段时间。
提前谢谢你。答案越详细越好。如果您对问题有不同的方法,请提供代码,以便我从中学习。
【问题讨论】:
-
r'(?<=\"\:)(.*?)(?=\,\"shopID)'我相信这里的“shopID”会让你输掉比赛。 Nonetype 对象没有属性组只是意味着您的正则表达式引擎找不到匹配项 -
这种模式确实有效,它为我带来了特定于餐厅的数据。问题出在 for 循环中的某处,并出现在这一行: name = re.search(r'(?
-
在这种情况下,也许只需将您的逻辑块包含在 if-else 语句中。如果对象是 Nonetype 则继续迭代
-
您的regex 与您的字符串不匹配。输入中没有
shopID。使用shortName":"([^"]+)。见the Python demo。 -
我非常想这样做,但我应该能够匹配每家餐厅的短名称字段。我检查了整个源文件,得到的短名称与显示名称一样多
标签: python regex python-2.7