RegEx для захвата и замены всех цифр в строке, кроме специальных шаблонов - PullRequest
2 голосов
/ 25 мая 2019

У меня есть текст, где цифры появляются всевозможными способами. Например,

text = "hello23 the2e are 13 5.12apples *specially_x00123 named 31st"

Я хочу заменить все цифры на '#', за исключением цифр в специальном шаблоне, начиная с *, слова, подчеркивания, любого символа и числа, таких что * \ w + _ [az] \ d + (т.е. * specially_x00123).

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

text_cleaned = "hello## the#e are ## #.##apples *specially_x00123 named ##st"

Я могу использовать шаблон, как показано ниже:

p1 = r'\d(?<!\*\w+_\w+)'

Тогда он жалуется вот так; «для просмотра требуется шаблон с фиксированной шириной»

Я пытался использовать группу без захвата:

p2 = r'(?:\*[a-z]+_\w+)\b|\d'

Вынимает специальный токен (* special_x000123) и все цифры. Я думаю, что это то, что я могу включить в решение, но я не могу найти как. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 25 мая 2019

Что вы можете сделать, это захватить цифру в группе захвата (\d) и использовать обратный вызов в проверке замены для первой группы захвата.

Если это группа 1, заменить на #, иначе верните совпадение.

Поскольку \w+ также соответствует подчеркиванию, вы можете сопоставить слово char, кроме подчеркивания, сначала используя класс символов с отрицательными буквами [^\W_\n]+

\*[^\W_\n]+_[a-z]\d+\b|(\d)

Regex demo | Python demo

import re
text = "hello23 the2e are 13 5.12apples *specially_x00123 named 31st"
pattern = r"\*[^\W_\n]+_[a-z]\d+\b|(\d)"
print (re.sub(pattern, lambda x: "#" if x.group(1) else x.group(), text))

Результат

hello## the#e are ## #.##apples *specially_x00123 named ##st
0 голосов
/ 25 мая 2019

Одним из вариантов может быть то, что мы разделяем нашу строку до до звезды, а затем после этого.Выражение (\d) захватывает каждую цифру перед звездой, которую мы можем просто заменить, используя #, тогда мы будем соединять ее с $2:

(\d)|(\*.*)

Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(\d)|(\*.*)"

test_str = ("hello23 the2e are 13 5.12apples *specially_x00123 named\n\n"
    "hello## the#e are ## #.##apples *specially_x00123 named")

subst = "#\\2"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

regex101.com

const regex = /(\d)|(\*.*)/gm;
const str = `hello23 the2e are 13 5.12apples *specially_x00123 named`;
const subst = `#$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);
...