Как получить N последовательных цифр из строки? - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь получить 4 последовательные цифры из строки, где бы она ни находилась.

когда я пытаюсь re.sub('[^\d]+', ',', "abc 23 [1981] ghj [5656]"), он возвращает ,23,1981,5656,. Поэтому, когда я делаю re.sub('[\d]{4}+', ',', "abc 23 [2021]"), он возвращает ошибку "multiple repeat at position 7"

Поскольку я сохраняю {4}, не должно ли оно совпадать для 4 вхождений [\d] и возвращать ,1981,5656,?

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

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

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

import re

s = "abc 23 [1981] ghj [5656]"
print(re.sub(r'\b(\d{4})\b|((?!\b\d{4}\b).)+', lambda x: x.group() if x.group(1) else ',', s))

Печатает следующее, как вы хотели,

,1981,5656,

То, что мы делаем здесь, это захват четырех цифр с использованием \b(\d{4})\b в группе 1 и захват любых других одного или нескольких символов, которые не имеют четырех цифр, с использованием этого регулярного выражения ((?!\b\d{4}\b).)+, и мы делаем условную замену, где, если сначала чередование сопоставляется, тогда group1 не является пустым, поэтому замените его сопоставленным текстом, а если group1 пусто, что означает совпадение второго регулярного выражения, то вместо этого замените его запятой.

1 голос
/ 28 мая 2019

Использование re.findall

Ex:

import re

s = "abc 23 [1981] ghj [5656]"
print(re.findall(r"\[(\d{4})\]", s))

Выход:

['1981', '5656']
...