Извлечение числа, предшествующего конкретному тексту, с помощью регулярного выражения - PullRequest
2 голосов
/ 11 февраля 2010

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

Я пользуюсь трубами Yahoo.

Исходный текст: S $ 5 200 / месяц Цена договорная, 1475 кв. Футов / 137 кв. М (встроенный) - Квартира, 10 Anson Road (D02)

Нужно извлечь как число: 1,475 а также (но может быть извлечен в отдельном случае) Нужно извлечь как число: 137

Я получил следующий образец от кого-то весьма полезного на другом форуме:

\ Ъ (\ D + (\ D +) *) \ S + (футы | кв.м.)

но когда я иду и использую его с заменой $ 1, он возвращает весь исходный текст вместо только нужных мне чисел (т. Е. 1475 или 137 в зависимости от того, запускаю ли я \ b (\ d + (, \ d +) ) \ s + (sqft) или \ b (\ d + (, \ d +) ) \ s + (sqm)

что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 11 февраля 2010

Ну, вы могли бы сделать это, перебирая совпадения и получая результаты таким образом.

Но если вы хотите использовать метод замены, тогда это может сработать:

^.*?(?<sqft>\d+(,\d+)*)\s?sqft.*?(?<sqm>\d+(,\d+)*)\s?sqm.*$

А затем заменить на:

${sqft}
${sqm}

Вот оно в действии.

Это будет работать с запятой или без запятой в числах sqft или sqm. И. * В начале, в середине и в конце вынуждает его соответствовать всей строке, так что текст замены исключает все, кроме того, что вы после.

0 голосов
/ 23 ноября 2010

Вы можете рассмотреть ситуации, обсужденные в этом ответе , при составлении регулярного выражения для чисел.

0 голосов
/ 11 февраля 2010

В Perl я бы написал что-то вроде:

if ($line ~= m/\b([0-9.,]+) sqft/)
{
  $sqft = $1;
}
else
{
  $sqft = undef;
}

if ($line ~= m/\b([0-9.,]+) sqm/)
{
  $sqm = $1;
}
else
{
  $sqm = undef;
}
0 голосов
/ 11 февраля 2010

Поскольку вы не указали язык, вот немного Python:

import re

s = "$ 5,200 / month Negotiable, 1,475 sqft / 137 sqm (built-in) - Apartment, 10 Anson Road (D02)"
print re.search(r'\b([0-9.,]+) ?sqft ?/ ?([0-9.,]+) ?sqm', s).groups()
# prints ('1,475', '137')

Поиск любого числа, запятой или точки после границы слова, за которым следует необязательный пробел и слово 'sqft', затем необязательный пробел, косая черта, необязательный пробел, за которым следует любое число, запятая, или точка, необязательный пробел, слово 'sqm'.

Это должно позволить вашему форматированию быть довольно свободным (необязательные пробелы, тысячи и десятичные разделители).

...