Regex заменить все, кроме шаблона - PullRequest
2 голосов
/ 28 апреля 2020

Возможно, это дубликат, но я пытаюсь заменить все, кроме определенного строкового шаблона. Вот пример строк:

'dkas;6-17'
'dsajdl 10'
'dsjalkdj16-20'

Цель здесь - заменить все, что не является числом-числом, ничем. Итак, что я получу из приведенных выше строк:

'6-17'
''
'16-20'

Вторая строка ничего не даст, потому что она не соответствует шаблону. Я знаю, что регулярное выражение соответствует моему шаблону, но я не совсем понимаю, как использовать regexp_replace для соответствия всем, кроме этого шаблона. Вот что у меня есть, но это заменяет шаблон, который я хочу сохранить.

re.sub('[0-9]{1,2}\-[0-9]{1,2}', '', text)

Ответы [ 3 ]

1 голос
/ 28 апреля 2020

Если вы подразумеваете, что секунда ничего не даст, вы можете сопоставить любой символ, кроме ди git или новой строки, с последующим захватом шаблона в группе.

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

[^\d\r\n]+(\d{1,2}-\d{1,2})|.+

По частям

  • [^\d\r\n]+ Совпадение 1+ раз с любым символом, кроме ди git или новая строка
  • (\d{1,2}-\d{1,2}) Захват группа 1 , совпадение 1-2 цифры, - и 1-2 цифры
  • | или
  • .+ Совпадение с любым символом, кроме новой строки, более 1 раза

Regex demo | Python демо

Пример кода

import re

lines = [
    'dkas;6-17',
    'dsajdl 10',
    'dsjalkdj16-20'
]

for text in lines:
    print(re.sub('[^\d\r\n]+(\d{1,2}-\d{1,2})|.+', r'\1', text))

Выход

6-17

16-20
0 голосов
/ 28 апреля 2020

Рассмотрим соответствие

\d+-\d+|$

Демо

Если бы строка была

dkas;6-17

, первое совпадение было бы 6-17, секунда будет пустой строкой в ​​конце строки.

Если строка будет

dsjalkdj16-20kl21-33mn

, будет три совпадения, 16-20, 21-33 и пустое место в конец строки.

Если бы строка была

dsajdl 10

, первое (и единственное) совпадение было бы пустой строкой в ​​конце строки.

Из этого следует, что если оно совпадает, то это будет пустая строка в конце строки, которая должна быть возвращена; в противном случае верните первое или все совпадения, кроме последнего, в зависимости от требований.

0 голосов
/ 28 апреля 2020

Как насчет просто найти все совпадения в строке и объединить их вместе?

>>> ''.join(re.findall('[0-9]{1,2}\-[0-9]{1,2}', 'dkas;6-17abc19-10'))
'6-1719-10'

>>> ''.join(re.findall('[0-9]{1,2}\-[0-9]{1,2}', 'dsajdl 10'))
''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...