регулярное выражение для игнорирования числа, за которым следует слово / нечисловой символ - PullRequest
2 голосов
/ 24 марта 2019

В Python я пытаюсь анонимизировать или замаскировать n символов (из последних). Это работает для совпадения, но я также хочу игнорировать слова, содержащие цифры.

* 1003 например *

string = 'SomeText +12 555 660 000 f00b4r abc123'
digits = 5
repl_char = 'X'

regex = '[0-9\s\+]+'

for match in re.finditer(regex, string):
    phone_no = match.group()
    new_ph_no = ''
    i = 0
    if phone_no in ['', ' ']:
        pass
    else:
        for phone_digit in phone_no[::-1]:
            if phone_digit == ' ' or i >= digits:
                new_ph_no += phone_digit
            else:
                new_ph_no += repl_char
                i += 1
        string = string.replace(phone_no, new_ph_no[::-1])
    print(string)

Текущий выходной сигнал: 'SomeText +x2 555 6xx xxx fxxbxr abcxxx'

Желаемый выход: 'SomeText +12 555 6XX XXX f00b4r abc123'

Я попытался добавить '[^?!a-zA-Z(0-9).*$]' к регулярному выражению, которое дало желаемый результат, но не удалось, когда я передаю строку как 'SomeText +12 555 660 000'

Мое намерение состоит в том, чтобы напечатать номер телефона из любого типа строки и заменить n цифр на 'x' (или любой символ)

Как распечатать нужный вывод?

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Используя lambda в re.sub, вы можете сделать:

>>> import re
>>> s = 'SomeText +12 555 660 000 f00b4r abc123'
>>> reg = r'(\b\d*(?: +\d+)*)((?: *\d){})(?! *\d)'
>>>
>>> print re.sub(reg.format('{5}'), lambda m: m.group(1) + re.sub(r'\d', 'X', m.group(2)), s)
SomeText +12 555 6XX XXX f00b4r abc123
>>>
>>> print re.sub(reg.format('{2}'), lambda m: m.group(1) + re.sub(r'\d', 'X', m.group(2)), s)
SomeText +12 555 660 0XX f00b4r abc123

Подробности:

  • Первое регулярное выражение (\b\d*(?: +\d+)*)((?: *\d){5})(?! *\d) соответствует последним 5 цифрамкоторым предшествуют 0 или разделенные пробелами цифры и за которыми не следуют дополнительные пробелы и цифры.
  • В re.sub мы используем лямбда-функцию
  • Внутри тела лямбда-функции мы заменяем каждую цифру набуква X
1 голос
/ 24 марта 2019

Если число всегда начинается с + и вы хотите получить полный номер без него, используйте:

\+(\d+(?:\s\d+)*)\b

и оно вернется (из вашего примера): 12 555 660 000

См. Онлайн: https://regex101.com/r/aEeIgK/2

Объяснение:

  • \+ начать с определения + перед началом нашего матча.Экранирование как + является квантификатором регулярного выражения.
  • \b заканчивается границей слова (поэтому, если смешанная строка начинается с цифр, она не будет частью совпадения).
  • (\d+(?:\s\d+)*) в скобках (...) - это то, что будет в совпадении.
    • \d+ одна или несколько цифр на старте - мачта.\d является цифрой;+ квантификатор для одной или нескольких.
    • (?:\s\d+)* необязательные (ноль или более) строки, начинающиеся с пробела \s, за которыми следуют цифры.
    • (?:...) не являетсясоответствует круглой скобке.
    • * квантификатор для нуля или более.
    • \s пробел (только один).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...