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

Я собираюсь сопоставить два случая: 123456-78-9 или 123456789. Моя цель состоит в том, чтобы извлечь 123456789 из любого случая, т.е. исключить «-» из первого случая, не нужно упоминать, что второй случайдовольно просто.

Я пытался использовать регулярное выражение вроде r"\b(\d+(?:-)?\d+(?:-)?\d)\b", но оно все равно возвращает мне 123456-78-9.

какое правильное регулярное выражение мне следуетиспользовать?Хотя я знаю, сделать это в два этапа: 1) получить три части цифр с помощью регулярных выражений 2) использовать другую строку для их объединения, но я все же предпочитаю регулярные выражения, чтобы код был более элегантным.

Спасибо за любыесоветы!

Ответы [ 3 ]

1 голос
/ 28 сентября 2019

Вы можете использовать r'(\d{6})(-?)(\d{2})\2(\d)'
, затем присоединиться к группам 1, 3 и 4 или заменить, используя "\\1\\3\\4"

Будет соответствовать только эти два входа:

123456-78-9, или 123456789

Вы можете установить граничные условия, если это необходимо.

https://regex101.com/r/ceB10E/1

0 голосов
/ 28 сентября 2019

Здесь проще всего было бы сначала использовать re.sub для удаления всех нецифровых символов из ввода.Затем используйте сравнение на равенство, чтобы проверить входные данные:

inp = "123456-78-9"
if re.sub(r'\D', '', inp) == '123456789':
    print("MATCH")

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

\b(?:\d{6}-\d{2}-\d|\d{9})\b

Сценарий:

inp = "123456-78-9"
if re.search(r'\b(?:\d{6}-\d{2}-\d|\d{9})\b', inp):
    print("MATCH")
0 голосов
/ 28 сентября 2019

Вы можете поместить части чисел в группы захвата, а затем заменить все совпадение только на захваченные группы.

Попробуйте что-то вроде:

\b(\d+)-?(\d+)-?(\d)\b

.. и замените на:

\1\2\3

Обратите внимание, что две группы без захвата, которые вы используете, являются избыточными.(?:-)? = -?.

Regex demo .

Пример Python:

import re

regex = r"\b(\d+)-?(\d+)-?(\d)\b"

test_str = ("123456-78-9\n"
            "123456789")
subst = "\\1\\2\\3"

result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

Выходные данные:

123456789
123456789

Попробуйте онлайн .

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