Как я могу сопоставить регулярное выражение в Python с точностью до определенного символа и вернуть None, если не совпадает? - PullRequest
0 голосов
/ 11 февраля 2019

Я хотел бы знать, возможно ли сопоставить регулярное выражение до определенного символа (':'), но избегая отрицательных логических выражений, таких как [^:] *, потому что я хотел бы, чтобы оно возвращало None, если не найдено совпадений,Посмотрите пример того, что ожидается:

import re
string='AbcS:sdaf'
pattern='whatever needed' # match all up to : 
re.search(pattern, string).group()

'AbcS'

string2='AbcSsdaf'
pattern2='whatever needed' # match all up to : 
re.search(pattern2, string2).group()

None

В другом посте я видел несколько ответов mencioning pattern = '[^:] *', но это не то, что я хочу, потому что возвращает всю строку, если естьне является ':' в строке.

Спасибо всем

Ответы [ 4 ]

0 голосов
/ 11 февраля 2019

Попробуйте это: re.search(pattern, string.split(":")[0]).group()

0 голосов
/ 11 февраля 2019

Вам нужна группа захвата:

pattern = '(.*):'  # this will match any and all characters up untill ":"
pattern = '([a-zA-Z])*:'  # this will match only letters
pattern = '([a-zA-Z0-9])*:'  # matches alphanumericals

Если вы говорите по критериям поиска, вы легко запомните, как воссоздать его самостоятельно: перехватить "()" что угодно "."столько раз, сколько возможно "*", пока вы не увидите точку с запятой ":".

Самое главное re.search вернет None, если в строке поиска нет ":".

0 голосов
/ 11 февраля 2019

Способ без регулярных выражений - разделить с помощью : и посчитать количество разделений.Если оно больше 1, получите первый элемент, иначе верните None:

splits = s.split(':')
if len(splits) > 1:
    print(splits[0])
else:
    print(None)

См. эту демонстрацию Python .

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

^([^:]*):

и захватить группу 1, если есть совпадение.См. regex demo .

Подробности

  • ^ - начало строки
  • ([^:]*) - Группа захвата 1: любые 0+ символов, кроме :
  • : - : char.

Python demo :

import re
strs= ['AbcS:sdaf', 'AbcSsdaf']
pattern= re.compile(r'([^:]*):') # re.match requires a match at  string start, ^ is redundant
for s in strs:
    m = re.match(pattern, s)
    if m:
        print(m.group(1))
    else:
        print(m)
0 голосов
/ 11 февраля 2019

Попробуйте это регулярное выражение:

^(?=.*:)[^:]*

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

Объяснение:

  • ^ - подтверждает начало строки
  • (?=.*:) - положительный прогноз, чтобы убедиться, что строка содержит :
  • [^:]* - соответствует 0+вхождения любого персонажа, который не является :
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...