как получить пробелы между каждым символом, когда идентифицируется alphanumeri c или число? - PullRequest
1 голос
/ 16 января 2020

Я имел следующую строку:

text = "126 2225xx009"

и использовал следующие выражения регулярных выражений для идентификации:

a) alphanumeri c слово (2225xx009):

\b([a-z]+[0-9]+|[0-9]+[a-z]+)[a-z0-9]*\b"

b) di git (126):

(\d+)

Я пытаюсь следующий фрагмент кода, чтобы получить пробелы между каждым и каждым символом, когда число или alphanumeri c найдено.

alphanumeric_text = re.sub("\b([a-z]+[0-9]+|[0-9]+[a-z]+)[a-z0-9]*\b", " \\1 ", text)
numeric_text = text = re.sub("(\d+)", " \\1 ", alphanumeric_text )

Желаемый результат:

1 2 6 2 2 2 5 x x 0 0 9

Ответы [ 2 ]

1 голос
/ 16 января 2020

Вы хотите вставить пробел между каждым символом каждого матча. Используйте lambda x: " ".join(x.group()) в качестве замены:

import re
text = "126 2225xx009"
rx_alnum = r"\b(?:[a-z]+[0-9]+|[0-9]+[a-z]+)[a-z0-9]*\b"
rx_digits = r"\d+"
alphanumeric_text = re.sub(rx_alnum, lambda x: " ".join(x.group()), text)
print(alphanumeric_text) # => 126 2 2 2 5 x x 0 0 9
numeric_text = text = re.sub(rx_digits, lambda x: " ".join(x.group()), alphanumeric_text )
print(text)              # => 1 2 6 2 2 2 5 x x 0 0 9

См. Python демо .

Небольшое примечание: "\b" (в вашем коде) соответствует Backspace, а не слово границы. См. Выше, r"\b" соответствует границе слова.

Вы можете объединить регулярные выражения в один шаблон:

rx = r"\b(?:[a-z]+[0-9]+|[0-9]+[a-z]+)[a-z0-9]*\b|\d+"
print(re.sub(rx, lambda x: " ".join(x.group()), text))
# => 1 2 6 2 2 2 5 x x 0 0 9

См. this Python demo .

0 голосов
/ 16 января 2020

Второй аргумент re.sub может быть str или функция , которая получит один аргумент типа re.Match. Этот объект имеет .group(0), который является найденной подстрокой. Функция должна вернуть замену str. Это должно стать более понятным, если вы рассмотрите пример. Допустим, вам нужны пробелы только внутри чисел (неотрицательные целые числа), тогда вы можете сделать следующее:

import re
text = "abc 123 xyz 999"
def func(x):
    return ' '.join(x.group(0))
out = re.sub(r'\b\d+\b', func, text)
print(out)

Вывод:

abc 1 2 3 xyz 9 9 9

Обратите внимание, что .group(0) дает вам полное совпадение независимо от группировки, поэтому вы можете свободно использовать ее в первом аргументе re.sub.

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