Как я могу сопоставить текст с двоеточием, используя регулярное выражение?

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

Соответствует таким вещам:

name: | :name | name:`asdf`

Но не должно совпадать ни с одним из них:

:name: 
eman: 
nnamee: 
:nameasdfj

У меня есть регулярное выражение, которое, я думаю, охватывает все случаи для первых трех, но оно также соответствует :name: чего я не хочу:

((?:^|\W)name:(?:$|\W))|((?:^|\W):name(?:$|\W))

person user1094771    schedule 06.06.2020    source источник
comment
Что ты собираешься делать с матчем? Заменить/извлечь/удалить/посчитать? Ну и всегда ли name является фиксированной строкой? Если да, попробуйте (?<!\w):?name(?!\w)(?!(?<=:name):), см. демонстрацию.   -  person Wiktor Stribiżew    schedule 06.06.2020
comment
По вашим правилам :nameasdfj не должно совпадать? Предполагая, что это так, и вы просто хотите сопоставить допустимые экземпляры "name", вы можете использовать регулярное выражение r':name(?!:)|(?<!:)name:', (?!:) в качестве отрицательного просмотра вперед и (?<!:) в качестве отрицательного просмотра назад. Демо   -  person Cary Swoveland    schedule 06.06.2020


Ответы (1)


Попробуйте (?<!\S)name:|:name(?!\S)

демонстрация

или небольшая граница использования (?<![a-z:])name:|:name(?![a-z:])

демонстрация 2


пример кода с использованием второго регулярного выражения

>>> import re
>>> regex = r'(?<![a-z:])name:|:name(?![a-z:])'
>>> content = 'asdf- name:'
>>> re.search(regex, content).group(0)
'name:'
person Community    schedule 06.06.2020
comment
Ваше регулярное выражение может быть сокращено до (?<!\S)name:|:name(?!\S), поскольку : не является пробельным символом. - person Wiktor Stribiżew; 06.06.2020
comment
да : никогда не может быть wsp - person ; 06.06.2020
comment
Любая причина, по которой это может работать на regex101, но не в моем реальном скрипте Python? В моем скрипте Python у меня есть регулярное выражение: r'(?‹![az:])name:|:name(?![az:])', а затем re.search(regex, content) Это работает для двоеточия раньше, но не что-то вроде этого: 'asdf-имя:' - person user1094771; 26.06.2020
comment
re.search возвращает объект соответствия, используйте элемент group(0), чтобы получить некоторый результат. Добавил пример кода. - person ; 26.06.2020
comment
пожалуйста, проголосуйте за @user1094771, если вы нашли этот ответ полезным. - person ; 26.06.2020
comment
@Edward Спасибо за первоначальный ответ, но добавление группы (0) по-прежнему не работает в этом случае. Содержимое читается из файла, поэтому мне интересно, может ли это повлиять на него (хотя это работает для случая :name). - person user1094771; 28.06.2020