我需要帮助从文本中提取src值(例如:LOC/IMG.png
)。执行此操作的任何最佳方法,因为我的文件数超过10 ^ 5个文件。
我有JSON如下:
{"Items":[{src=\"LOC/IMG.png\"}]}
答案 0 :(得分:1)
让我为parserers提出一个免责声明:我并不认为正则表达式是最酷的,而且我自己在任何地方都使用XML / JSON解析器。但是,当遇到任何格式错误的文本时,解析器通常无法处理我想要的qay。我必须添加regexish代码来处理这些情况。
因此,如果绝对需要正则表达式,请使用(?<=src=\\").*?(?=\\")"
正则表达式。 (?<=src=\\")
后视和前瞻(?= \“)将充当src
属性中值的边界。
以下是示例代码:
import re
p = re.compile(ur'(?<=src=\\").*?(?=\\")')
test_str = "YOUR_STRING"
re.findall(p, test_str)
请参阅demo。
答案 1 :(得分:1)
您的JSON包含一些HTML值。因此,如果可能的话,您应该将JSON解析为JSON,然后将HTML值解析为HTML。这需要您了解一些关于数据结构的内容 - 但无论如何这都是一件好事。
例如:
j = json.loads(s)
for item in j['Items']:
soup = bs4.BeautifulSoup(item['Item'])
for img in soup.find_all('img'):
yield img['src']
这个可能太慢了,但只需要几分钟就可以编写正确的代码,在1000个随机代表文件上运行它,然后弄清楚它是否足够快,当推断到任何时候“1 Lakh的文件数”是。如果它足够快,那就这样做吧;在其他条件相同的情况下,最好是正确而简单,而不是变得笨拙或复杂,如果意外的数据显示为错误的话,如果它们显示为不正确的结果,那么你将节省时间通知直到一周后...
如果您的文件大约是2K,就像您的示例一样,我的笔记本电脑可以json.loads
2K随机JSON和BeautifulSoup
2K随机HTML,时间比从硬盘读取2K所花费的时间少,所以更糟糕的是,这只需要读取数据和无所事事的时间的两倍。如果你的CPU速度很慢,SSD速度很快,或者你的数据非常不寻常等,那可能不是真的(这就是你测试的原因,而不是猜测),但我认为你会好的。