Удалите цифры в Python (Regex)

Если вам нужна плоская группировка на основе двух или более свойств, используйте обратный вызов _.groupBy(), чтобы объединить свойства в строку:

const addArray = [{"id":24,"language_id":3,"type":"service","type_id":2,"key":"service seeker","value":" need service"},{"id":23,"language_id":3,"type":"service","type_id":2,"key":"phone","value":"phone number"},{"id":24,"language_id":3,"type":"service","type_id":7,"key":"tester","value":"service tester"},{"id":19,"language_id":3,"type":"offer","type_id":4,"key":"source","value":"resource"}]

const result = _.groupBy(addArray, o => `${o.type}-${o.type_id}`)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
[ 1116]

Если вам нужна многоуровневая группировка, начните с группировки по type, затем сопоставьте группы с _.values() и снова сгруппируйте их по type_id:

[ 1115]
const { flow, partialRight: pr, groupBy, mapValues } = _

const fn = flow(
  pr(groupBy, 'type'),
  pr(mapValues, g => groupBy(g, 'type_id'))
)

const addArray = [{"id":24,"language_id":3,"type":"service","type_id":2,"key":"service seeker","value":" need service"},{"id":23,"language_id":3,"type":"service","type_id":2,"key":"phone","value":"phone number"},{"id":24,"language_id":3,"type":"service","type_id":7,"key":"tester","value":"service tester"},{"id":19,"language_id":3,"type":"offer","type_id":4,"key":"source","value":"resource"}]

const result = fn(addArray)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

16
задан John Doe 4 September 2019 в 12:37
поделиться

7 ответов

Add a space before the \d+.

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> s = re.sub(" \d+", " ", s)
>>> s
'This must not b3 delet3d, but the number at the end yes '

Edit: After looking at the comments, I decided to form a more complete answer. I think this accounts for all the cases.

s = re.sub("^\d+\s|\s\d+\s|\s\d+$", " ", s)
27
ответ дан 30 November 2019 в 15:26
поделиться

Решение без регулярного выражения:

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> " ".join([x for x in s.split(" ") if not x.isdigit()])
'This must not b3 delet3d, but the number at the end yes'

Разбивает на "" и проверяет, является ли чанк числом, выполняя str (). Isdigit () , затем соединяет их вместе. Более подробно (без использования понимания списка):

words = s.split(" ")
non_digits = []
for word in words:
    if not word.isdigit():
        non_digits.append(word)

" ".join(non_digits)
1
ответ дан 30 November 2019 в 15:26
поделиться

To handle digit strings at the beginning of a line as well:

s = re.sub(r"(^|\W)\d+", "", s)
3
ответ дан 30 November 2019 в 15:26
поделиться

Я не знаю, как выглядит ваша реальная ситуация, но большинство ответов выглядят так, как будто они не обрабатывают отрицательные числа или десятичные числа,

re.sub (r "(\ b | \ s + \ -? | ^ \ -?) (\ d + | \ d * \. \ d +) \ b "," ")

Вышесказанное также должно обрабатывать такие вещи, как,

" Это не должно b3 delet3d, но число в конце да -134.411 "

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

Редактировать: это Также стоит отметить, что «\ b» меняется в зависимости от используемой локали / набора символов, поэтому вам нужно быть немного осторожнее с этим.

1
ответ дан 30 November 2019 в 15:26
поделиться

If your number is allways at the end of your strings try : re.sub("\d+$", "", s)

otherwise, you may try re.sub("(\s)\d+(\s)", "\1\2", s)

You can adjust the back-references to keep only one or two of the spaces (\s match any white separator)

2
ответ дан 30 November 2019 в 15:26
поделиться

Try this:

"\b\d+\b"

That'll match only those digits that are not part of another word.

14
ответ дан 30 November 2019 в 15:26
поделиться

Использование \ s не очень хорошо, так как не обрабатывает вкладки, и др. Первое сокращение в лучшем решении:

re.sub(r"\b\d+\b", "", s)

Обратите внимание, что шаблон является необработанной строкой, потому что \ b обычно является escape-символом возврата для строк, и вместо этого мы хотим использовать специальный экранирующий символ regex. Немного более причудливая версия:

re.sub(r"$\d+\W+|\b\d+\b|\W+\d+$", "", s)

, которая пытается удалить начальные / конечные пробелы, когда есть цифры в начале / конце строки. Я говорю «пытается», потому что если в конце есть несколько чисел, у вас все еще есть пробелы.

6
ответ дан 30 November 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: