2015-09-09 5 views
0

я работаю с данными, который выглядит примерно так:Regex, который удаляет все, кроме указанной строки,

{"score":0,"compare":0,"words":["book","planet","sun","science"],"words":[],"good":[],"bad":[]} 
{"score":-1,"compare":0,"words":["book","planet","sun","science"],"words":[],"good":[],"bad":[]} 
{"score":1,"compare":0,"words":["book","planet","sun","science"],"words":[],"good":[],"bad":[]} 

Единственная информация, что я заинтересован в является «оценка» : # (который может быть либо положительное или отрицательное). Так как я работаю с тысячами строк, которые выглядят выше, я пытаюсь извлечь только информацию оценки, которая меня интересует, используя regular expression.

Я, например, консультировался с различными сообщениями, например here, here и here, но ни один из них, похоже, не касается моей проблемы.

Я использовал их, чтобы попытаться написать собственное регулярное выражение. До сих пор я пытался вещи, такие как:.

(?!"score":(-)?[0-9]) 

^(?!"score":(-)?[0-9].* 

(.(?!"score":(-)?[0-9]))* 

, но каждый из этих примеров выбирает ALL информации, в том числе то, что я заинтересован в

Как я могу изменить эти регулярные выражения, чтобы прибыть на мой желаемый результат, который:

"score":0 
"score":-1 
"score":1 
+0

Почему бы не просто подобрать нужный вам текст? – anubhava

+1

Это строки JSON, и если они появляются по строкам, вы можете прочитать файл по строкам, проанализировать строку и получить значение 'score'. Зачем использовать регулярное выражение? –

+0

Я пытался найти решение, которое автоматически удалит всю другую информацию, которая меня не интересует. Эта информация представляет собой один столбец в довольно большом TSV-файле, поэтому я хотел выделить эту информацию. – owwoow14

ответ

1

Ваших регэксп не работают, как ожидалось:

  1. (?!"score":(-)?\[0-9\]) матчей пустых пространств перед каждым символом, который не сопровождается с "score":\d+
  2. ^(?!"score":(-)?\[0-9\].*) спичек пустого пространства в начале строки
  3. (.(?!"score":(-)?\[0-9\]))* матчи каждые символ, но открытие {.

Вы можете использовать

.*("score":[-+]?\d*\.?\d+).* 

См demo

Заменить $1.

Если вам не нужна поддержка чисел с плавающей точкой, просто используйте

.*("score":[-+]?\d+).* 

См another demo

Основная концепция согласования все строки и захватить подстроку нам нужно ("score":<number>). Затем мы возвращаем захваченный текст в заменяющей строке.

Здесь

  • .* - совпадает с любым количеством других, чем символ новой строки
  • ("score":[-+]?\d*\.?\d+) персонажей - соответствует
    • "score": - "score": буквально
    • [+-]? - либо буквальным + или - (вы можете сохранить или настроить самостоятельно)
    • \d*\.?\d+ соответствует поплавки (без разделителей тысяч) или
    • \d+ - соответствует последовательности 1 или более цифр.
Смежные вопросы