Сопоставить строку с определенной строкой для извлечения значений Python Regex - PullRequest
1 голос
/ 21 мая 2019

У меня возникли некоторые проблемы с поиском правильного регулярного выражения для этой задачи, извините за мои начальные навыки. То, что я пытаюсь сделать, это только получить значение идентификатора из строки, где его «доступно»: true не «доступно»: false. Я могу получить идентификаторы всех строк через re.findall('"id":(\d{13})', line, re.DOTALL) (13 должно точно соответствовать 13 цифрам, так как в коде есть другие идентификаторы, содержащие менее 13 цифр, которые мне не нужны).

{"id":1351572979731,"parent_pid":21741,"available":false,"lou":"678","feature":true,"pub":true,"require":null,"option4":""},
{"id":1351572329731,"parent_pid":21741,"available":false,"lou":"678","feature":true,"pub":true,"require":null,"option4":""},
{"id":1351572943231,"parent_pid":21741,"available":true,"lou":"678","feature":true,"pub":true,"require":null,"option4":""},
{"id":1651572973431,"parent_pid":21741,"available":true,"lou":"678","feature":true,"pub":true,"require":null,"option4":""},

Следовательно, конечные результаты должны быть ['1651572973431', '1351572943231']

Ценю большую помощь, спасибо

Ответы [ 3 ]

3 голосов
/ 21 мая 2019

Это может быть не очень хороший ответ - это зависит от того, что именно у вас есть.Это выглядит , как будто у вас есть список строк, и вы хотите идентификаторы из некоторых из них.Если это так, это будет намного чище и легче для чтения, если вы будете анализировать JSON, а не писать византийское регулярное выражение.Например:

import json

# lines is a list of strings:

lines = ['{"id":1351572979731,"parent_pid":21741,"available":false,"lou":"678","feature":true,"pub":true,"require":null,"option4":""}',
'{"id":1351572329731,"parent_pid":21741,"available":false,"lou":"678","feature":true,"pub":true,"require":null,"option4":""}',
'{"id":1351572943231,"parent_pid":21741,"available":true,"lou":"678","feature":true,"pub":true,"require":null,"option4":""}',
'{"id":1651572973431,"parent_pid":21741,"available":true,"lou":"678","feature":true,"pub":true,"require":null,"option4":""}',
]

# parse it and you can use regular python to get what you want:
[line['id'] for line in map(json.loads, lines) if line['available']]

результат

[1351572943231, 1651572973431]

Если код, который вы разместили, представляет собой одну длинную строку, вы можете заключить его в [] и затем проанализироватькак массив с тем же результатом:

import json

line = r'{"id":1351572979731,"parent_pid":21741,"available":false,"lou":"678","feature":true,"pub":true,"require":null,"option4":""}, {"id":1351572329731,"parent_pid":21741,"available":false,"lou":"678","feature":true,"pub":true,"require":null,"option4":""}, {"id":1351572943231,"parent_pid":21741,"available":true,"lou":"678","feature":true,"pub":true,"require":null,"option4":""},{"id":1651572973431,"parent_pid":21741,"available":true,"lou":"678","feature":true,"pub":true,"require":null,"option4":""}'

lines = json.loads('[' + line + ']')
[line['id'] for line in lines if line['available']]
2 голосов
/ 21 мая 2019

Это работает, чтобы соответствовать тому, что вы хотите

(?<="id":)\d{13}(?=(?:,"[^"]*":[^,]*?)*?,"available":true)

https://regex101.com/r/FseimH/1

Расширен

 (?<= "id": )
 \d{13} 
 (?=
      (?: ," [^"]* ": [^,]*? )*?
      ,"available":true
 )

объяснил

 (?<= "id": )                        # Lookbehind assertion for id
 \d{13}                              # Consume 13 digit id
 (?=                                 # Lookahead assertion
      (?:                                 # Optional sequence
           ,                                   # comma
           " [^"]* "                           # quoted string
           :                                   # colon
           [^,]*?                              # optional non-comma's
      )*?                                 # End sequence, do 0 to many times - 
      ,"available":true                   # until we find  available = true
 )
1 голос
/ 21 мая 2019

Здесь мы можем просто использовать «id» в качестве левой границы и собрать нужные числа в группе захвата:

"id":([0-9]+)

enter image description here

Затем мы можем продолжить добавлять границы к нему.Например, если требуется 13 цифр, мы можем просто:

\"id\":([0-9]{13})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...