1
jin6220 OP for title in titles:
print(title) 别人上传的代码怎么那么结构清晰啊 =,= |
2
zhjits 2017-01-14 23:09:20 +08:00
直接读 JSON 转成的 dict 不行么
|
3
decken 2017-01-14 23:11:52 +08:00 via iPhone
用 json.loads 反序列化出对象,再 get 一下就 ok 了
|
4
golmic 2017-01-14 23:12:00 +08:00 via Android
url":"[^"]+
|
6
cdwyd 2017-01-14 23:12:13 +08:00 via Android
re.compile('article/(\d+)/')
|
7
fy 2017-01-14 23:13:38 +08:00
这需求不要用正则,本身例外多早晚出事。直接 json 解轻松愉快。
|
9
Yinz 2017-01-14 23:18:44 +08:00
如果不要求一定用正则的话, json 直接读成 dict 就好了,如 3 、 5 楼所说
j2=str(json.loads(j)) #必须转换成字符串才能正则匹配。 titles=re.findall(r"(?<='title_hide':).*?(?=,)",j2,re.M) print(len(titles)) for title in titles: print(title) urls=re.findall(r"'url':(.*?),.?'title'",j2,re.M) #这里不对,不知道如何弄出来了 print(len(urls),urls) 上面这几行改成 j2=json.loads(j) print(j2.get('title_hide')) print(j2.get('url')) 应该就没问题的了 |
11
jin6220 OP 当初没用字典是嫌麻烦,各种套嵌。看来明天还得再看看正则。
|
13
jin6220 OP @Yinz 嗯 你那个结构好像不对 但是换成 json 无非就是套嵌 dict 循环下就立马解出了 正则不如派森像是人类语言啊啊啊
但是还是很想弄懂正则怎么写 毕竟有时候只有正则解决问题很暴力 =,= |
14
lxy 2017-01-15 00:25:13 +08:00
要是有人在工作中有 json 不用非要用正则写一堆“乱码”会被我捏脸的。 4 楼那个就是了,不过漏了空格,稍微严谨一点的写法:
"url"\s*:\s*"(.+?)"\s*, |
15
Allianzcortex 2017-01-15 00:42:13 +08:00
其实我想说的很多时候返回的 JSON 格式顺序是不固定的,调好了这一个正则,下次请求的时候内容就又变了。所以???
|
17
jin6220 OP @Yinz 里头的主体结构类似是:
{ "result": [{"title_hide": ...,,"url": ...},{title_hide:...,url:...},{title_hide:...,url:...},,{title_hide:...,url:...},其他字典]} result 的值是一个列表,列表里的字典都是并列结构,不循环可以? |
19
wyntergreg 2017-01-15 08:57:55 +08:00
不用 JSON 非要正则,舍近求远?
|
20
allenhu 2017-01-15 09:12:48 +08:00 via Android
无知者无畏
|
22
jin6220 OP 正则前后关系匹配:"url"\s*:\s*"(.+?)"\,\s*"title re.M
但是实际 url 的邻居可能会变. |
23
jin6220 OP 吃饭去了。。。
总结下 非正则的办法: 第一步: a=j2['result'] (这里 j2 就不用字符串话了) a 是一个列表,里面是 20 个并联关系的字典。 第二部: >>> for b in a : print(b.get('title_hide')) >>> for b in a : print(b.get('url')) 正则方法: 第一种 urls=re.findall(r"(?<='url':)\s*'http://www.guokr.com/article/\d{5,7}/'(?=,)",str(j2)) 第二种(看运气,前后邻居可能会变,然后就失效) urlsre=re.findall(r"'url'\s*:\s*'(.+?)',\s*'title'",str(j2),re.M) |
24
Valyrian 2017-01-15 09:56:11 +08:00 via iPad 1
这是理论上行不通的,因为 regex parse 的是 regular language , json isn't a regular language
http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags |
26
jin6220 OP @Valyrian 理论是不行,第一次也是发现不对,然后就把 json ( dict )数据 str 化了,最后是找到结果了。
|
27
sola97 2017-01-15 10:31:31 +08:00 via Android
这么简单还不用 dict...有写正则的功夫早就 get 完了
|
28
Merlini 2017-01-15 11:09:14 +08:00 via Android
而且正则也慢啊
|
29
zzn 2017-01-15 11:56:46 +08:00 1
解析 xml/json 不要用正则
解析 xml/json 不要用正则 解析 xml/json 不要用正则 |
30
zhidian 2017-01-15 12:00:07 +08:00
JSON 也有 xpath 类似的工具啊……
|
32
imlonghao 2017-01-15 12:34:34 +08:00
import requests
a = requests.get('http://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&subject_key=diy&limit=20&offset=18&_=1484373021355').json() result = [[x['title_hide'], x['url']] for x in a['result']] |
33
imlonghao 2017-01-15 12:35:48 +08:00
不!要!用!正!则!处!理 json 数!据!
|
35
eoo 2017-01-15 23:14:55 +08:00 via Android
PHP json_decode($json); 搞定 啊哈哈
|
36
Ouyangan 2017-01-16 00:09:52 +08:00
正则处理 json 属于野路子.本身就是结构化的数据为什么用正则呢?
|
37
xiamx 2017-01-16 01:35:48 +08:00
|