【问题标题】:Two very similar Regex, other could not find match两个非常相似的正则表达式,其他找不到匹配
【发布时间】: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'(?&lt;=\"\:)(.*?)(?=\,\"shopID)' 我相信这里的“shopID”会让你输掉比赛。 Nonetype 对象没有属性组只是意味着您的正则表达式引擎找不到匹配项
  • 这种模式确实有效,它为我带来了特定于餐厅的数据。问题出在 for 循环中的某处,并出现在这一行: name = re.search(r'(?
  • 在这种情况下,也许只需将您的逻辑块包含在 if-else 语句中。如果对象是 Nonetype 则继续迭代
  • 您的regex 与您的字符串不匹配。输入中没有shopID。使用shortName":"([^"]+)。见the Python demo
  • 我非常想这样做,但我应该能够匹配每家餐厅的短名称字段。我检查了整个源文件,得到的短名称与显示名称一样多

标签: python regex python-2.7


【解决方案1】:

您的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",'))

【讨论】:

  • 感谢您和@kerwei 在 cmets 和此答案中的帮助。这个问题现在解决了,我学到了很多东西。
猜你喜欢
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多