Регулярные гуру! вот тизер: смешанные разделители тысяч и CSV - PullRequest
0 голосов
/ 01 мая 2010

У меня есть строка как ...

"labour 18909, liberals 12,365,conservatives 14,720"

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

(labour => 18909, liberals => 12365, conservatives => 14720)

О, если бы у меня было время выяснить регулярные выражения! Возможно я куплю один как туалетную книгу, ммм.

Ответы [ 5 ]

2 голосов
/ 01 мая 2010

Два лайнера. Также получим независимых:

preg_match_all('/([a-zA-Z]+)\s*([\d,]+)(?:,|$)/', $str, $matches);
$totals = array_combine($matches[1], $matches[2]);

/* total:
Array
(
    [labour] => 18909
    [liberals] => 12,365
    [conservatives] => 14,720
)
*/
2 голосов
/ 01 мая 2010

Вы можете выполнить поиск и заменить, например, на sed:

> echo '"labour 18909, liberals 12,365,conservatives 14,720"'
    | sed -r -e 's/([0-9]),([0-9]{3})/\1\2/g'
"labour 18909, liberals 12365,conservatives 14720"

Я не совсем уверен, каким будет синтаксис PHP, но он в основном принимает шаблон, состоящий из цифры (X), запятой и трех других цифр (Y), и заменяет их только битом XY.

1 голос
/ 01 мая 2010

Кажется, что вы хотите удалить запятые только , если они окружены цифрами . Извините, я не знаю особенностей синтаксиса PHP regex, но пара более абстрактных примеров:

str.replace("(\d+),(\d+)", "$1$2")
s/([0-9]+),([0-9]+)/\1\2/g

Они получат все правильные числа, но также получат что-то, что не совсем правильно, например, "2,41,11"

0 голосов
/ 01 мая 2010

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

Я всегда считал целесообразным следовать этой стратегии

  1. Знай своих данных

    . Клиент всегда скажет, что его данные идеальны, правильно сформированы и правильны

    . Это неизменно куча парящей додо-кормы.

  2. Определите правила для данных, иногда легче определить, чем не являются данные

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

  4. Ремонт, запрос новых наборов данных, сброс данных

  5. Повторите шаги 3 и 4, пока данные не станут чистыми

  6. Теперь подумайте о формате данных, можно ли упростить сопоставление регулярных выражений с помощью некоторых простых манипуляций с данными

    . Например, в вашем случае замена запятой, за которой следуют несколько пробелов, одной запятой

    . Затем удалите каждую запятую, окруженную числами

    . убрать несколько пробелов (оставить один пробел)

    . уберите пробел непосредственно перед и альфа-символом

  7. Определите правила для этого нового набора данных и убедитесь, что он чистый

    . теперь это может включать проверку диапазона числовых данных

    . еще более сложные правила

  8. Теперь ваши данные выглядят как «труд 18909, либералы 12365, консерваторы 14720»

  9. Создайте свой инструмент импорта для этого нового набора данных (легкий бит)

  10. Убедитесь, что у вас есть повторяемая система для 1..9, так как клиенту потребуется простое изменение или просто этот дополнительный маленький кусочек, который ему нужен прямо сейчас.

0 голосов
/ 01 мая 2010

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

labour\s*([\d,.]+),\s*liberals\s*([\d,.]+),\s*conservatives\s*([\d,.]+)

в конце концов, число явно заканчивается в точке, где больше не следует цифр. Затем вы можете продолжить удаление запятых из значений.

Демонстрация PowerShell (немного сжатая, извините):

PS Home:\> $s -match 'labour\s*(?<labour>[\d,.]+),\s*liberals\s*(?<liberals>[\d,.]+),\s*conservatives\s*(?<conservatives>[\d,.]+)' |
               Out-Null
PS Home:\> "Labour: {0}`nLiberals: {1}`nConservatives: {2}" -f `
           ($Matches['labour'],$Matches['liberals'],$Matches['conservatives'] |
               foreach { $_ -replace ',' })

Labour: 18909
Liberals: 12365
Conservatives: 14720
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...