Использовать регулярное выражение с чем-то вроде формата «xxx: abc», чтобы соответствовать только «abc»?

#regex

#регулярное выражение

Вопрос:

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

Вот несколько примеров входных данных:

документ: ASoi4jgt0w9efcZXNDOFzsdpfoasdf-zGRnae4iwn2, файл: 90jfa9_189204hsfiansdIASDNF, pdf: a09srjbZXMgf9oe90rfmasasgjm4-ab, электронная таблица: ASr0gk0jsdfPAsdfn

И вот что я хотел бы сопоставить в каждом из этих примеров: ASoi4jgt0w9efcZXNDOFzsdpfoasdf-zGRnae4iwn2, 90jfa9_189204hsfiansdIASDNF, a09srjbZXMgf9oe90rfmasasgjm4-ab, ASr0gk0jsdfPAsdfn

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

Ответ №1:

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

Альтернативой было бы [^:]*$ , которое возвращает вам все символы в конце строки вплоть до двоеточия, но не включая последний символ в строке, который является двоеточием.

Комментарии:

1. Второй вариант отлично работает и его очень легко понять. Спасибо!

Ответ №2:

Используйте что-то вроде приведенного ниже:

 ([^:]*)(,|$)
  

и получаем первую группу. Вы можете использовать группу без захвата (?:ABC) , если это необходимо для последнего. Также это делает предположение, что само значение может иметь , в качестве одного из символов.

Я не думаю, что такие ответы, как (.*):(.*) , сработали бы. Оно будет соответствовать всей строке.

Ответ №3:

(.*):(.*)

И возьмите вторую группу захвата…

Ответ №4:

Кажется, что проще всего [^:]*:([^,]*)(?:,|$) .

То есть найдите что-то, в чем есть что-то (возможно, ничего) вплоть до двоеточия, затем двоеточие, затем все, что не включает запятую (которая соответствует), вплоть до запятой или конца строки.

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

Итак, в python:

 import re

exampStr = "document:ASoi4jgt0w9efcZXNDOFzsdpfoasdf-zGRnae4iwn2, file:90jfa9_189204hsfiansdIASDNF, pdf:a09srjbZXMgf9oe90rfmasasgjm4-ab, spreadsheet:ASr0gk0jsdfPAsdfn"

regex = re.compile("[^:]*:([^,]*)(?:,|$)")
result = regex.findall(exampStr)
print result

#
# Result:
#
#   ['ASoi4jgt0w9efcZXNDOFzsdpfoasdf-zGRnae4iwn2', '90jfa9_189204hsfiansdIASDNF', 'a09srjbZXMgf9oe90rfmasasgjm4-ab', 'ASr0gk0jsdfPAsdfn']
#
#
  

Хорошее введение находится на: http://www.regular-expressions.info/tutorial.html .