#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 .