получить подстроку из элемента в трубах Yahoo - PullRequest
0 голосов
/ 18 февраля 2011

следующая ситуация:

item.
   content => "This is a 48593 test"
   title => "the title"

item.
   content => "This is a 48593 test 3255252"
   title => "the title"

item.
   content => "This 35542 is a 48593 test"
   title => "the title"

item.
   content => "i havent exactly 5 digits 34567654"
   title => "the title"

это мой текущий пункт в консоли труб

нет, я хочу заменить "содержимое" на "последнее совпадение числа, которое имеет ровно 5 цифр желаемый результат:

item.
   content => "48593"
   title => "the title"

item.
   content => "48593"
   title => "the title"

item.
   content => "48593"
   title => "the title"

item.
   content => ""
   title => "the title"

есть ли способ сделать это в Pypes 2?

прокомментируйте, если что-то неясно

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Используйте модуль регулярных выражений следующим образом:

В item.content заменить (.*) на X $1

В item.content заменить .*\b(\d{5})\b.* на $1

В item.content заменить X .* ничем (оставить поле пустым)

Вот пример трубы

Некоторые пояснения

  • \d{5} находит ровно пять цифр
  • \b границы слов, так что числа с большими цифрами не найдены
  • X в начале помечает строки, где регулярное выражение не соответствует, чтобы удалить их потом
  • поиск последнего номера, а не первого, является поведением по умолчанию. Потому что * - жадный оператор.
0 голосов
/ 18 февраля 2011

извините, я не знаю ничего, кроме Python

но так как ваша проблема меня заинтересовала и что регулярные выражения более или менее одинаковы во всех языках, я предлагаю свое решение на Python

import re

pat = re.compile("(?:.*((?<!\d)(?:\d{5})(?!\d))|\Z).*")

gh = ("This is a 48593 test",
      "This is a 48593 test 3255252",
      "This 35542 is a 48593 test",
      "i havent exactly 5 digits 34567654")

for x in gh:
    print x
    print 'AAA'+pat.search(x).groups("")[0]+'ZZZ'
    print

Результаты

This is a 48593 test
AAA48593ZZZ

This is a 48593 test 3255252
AAA48593ZZZ

This 35542 is a 48593 test
AAA48593ZZZ

i havent exactly 5 digits 34567654
AAAZZZ

«AAA» и «ZZZ» не имеют никакой другой утилиты, чтобы показать, что четвертый результат дает «»

"" в группах ("") дает значение по умолчанию "" , когда нет совпадений

В противном случае четвертый результат будет Нет :

import re

pat = re.compile("(?:.*((?<!\d)(?:\d{5})(?!\d))|\Z).*")

gh = ("This is a 48593 test",
      "This is a 48593 test 3255252",
      "This 35542 is a 48593 test",
      "i havent exactly 5 digits 34567654")

for x in gh:
    print x
    print pat.search(x).groups()[0]
    print

результаты в

This is a 48593 test
48593

This is a 48593 test 3255252
48593

This 35542 is a 48593 test
48593

i havent exactly 5 digits 34567654
None
...