Как эффективно передавать или игнорировать некоторые токены, разрешенные регулярным выражением Python? - PullRequest
0 голосов
/ 26 декабря 2018

Я применяю функцию к списку токенов следующим образом:

def replace(e): 
    return e


def foo(a_string):
    l = []
    for e in a_string.split():
        l.append(replace(e.lower()))
    return ' '.join(l)

Со строкой:

s = 'hi how are you today 23:i ok im good 1:i'

Функция foo исправляет написание токенов в s.Однако есть некоторые случаи, которые я хотел бы игнорировать, например, 12: i или 2: i.Как я могу применить foo ко всем токенам, которые не разрешены регулярным выражением: \d{2}\b:i\b|\d{1}\b:i\b?То есть мне бы хотелось, чтобы foo игнорировал все токены с формой 23:i или 01:e или 1:i.Я думал о регулярном выражении, однако, возможно, есть лучший способ сделать это.

Ожидаемый результат будет:

'hi how are you today 23:i ok im good 1:e'

Другими словами, функция foo игнорирует токеныс формой nn:i или n:i, где n - число.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вы можете использовать

import re

def replace(e): 
    return e

s = 'hi how are you today 23:i ok im good 1:e'
rx = r'(?<!\S)(\d{1,2}:[ie])(?!\S)|\S+'
print(re.sub(rx, lambda x: x.group(1) if x.group(1) else replace(x.group().lower()), s))

См. Демонстрационную версию Python онлайн и демонстрационную версию regex .

Соответствует шаблону (?<!\S)(\d{1,2}:[ie])(?!\S)|\S+

  • (?<!\S)(\d{1,2}:[ie])(?!\S) - 1 или 2 цифры, : и i или e, которые заключены в пробелы или начальные / конечные позиции строки (с подстрокой, захваченной в группу 1)
  • | - или
  • \S+ - 1+ непробельных символов.

Как только группа 1 совпадает, ее значение вставляется обратно, как есть, иначе,совпадение в нижнем регистре передается методу replace, а результат возвращается.

Другой подход к регулярному выражению:

rx = r'(?<!\S)(?!\d{1,2}:[ie](?!\S))\S+'
s = re.sub(rx, lambda x: replace(x.group().lower()), s)

См. еще одну демонстрацию Python и regex demo .

Подробности

  • (?<!\S) - проверяет, является ли символ слева направо пробелом, или устанавливает начальную позицию строки
  • (?!\d{1,2}:[ie](?!\S)) - отрицательный прогноз, который не дает совпадения, если непосредственно справа от текущего местоположения есть 1 или 2 цифры, :, i или e,и затем пробел или конец строки должен следовать
  • \S+ - 1+ непробельных символов.
0 голосов
/ 26 декабря 2018

Попробуйте это:

s = ' '.join([i for i in s.split() if ':e' not in i])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...